IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

delete et delete []


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut delete et delete []
    Bonjour,
    une question bête,
    lorsque l'on alloue de la memoire, on est sensé utiliser delete et delete [] suivant le cas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    toto* t1 = new toto;
    delete t1;
     
    toto * t2 = new toto[10];
    delete []  t2;
    mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    toto* t1 = new toto;
    delete [] t1;
    est normalement correcte?

    Du coup, pourquoi avoir deux sorte de delete??

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    toto* t1 = new toto; delete [] t1;
    est normalement correcte?
    Justement, non.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 159
    Par défaut
    Et :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    toto* t1 = new toto[1];
    delete [] t1;
    fonctionne-t-il ??

    Si oui, quelle est la différence entre l'objet créé en faisant
    et
    ?

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Quelques éléments de réponses dans une entrée de C++ FAQ Lite (et la suivante).
    Donc en résumé il ne faut surtout pas mélanger (et l'implémentation dépend du compilateur) !

    MAT.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 76
    Par défaut
    Arrêtez-moi si je me trompe :

    Si j'ai bien suivi le lien de Mat, la différence va se situer dans le nombre d'opérateurs de destruction qui seront appelés.

    Dans le cas du delete, il appelle le destructeur de l'objet, puis libère la mémoire du tableau.
    Dans le cas du delete [], il appelle le destructeur de chaque objet, puis libère la mémoire du tableau.

    Après suivant les types de compilos (38-7 et 38-8), ça ne libère qu'un objet, ou ça fait carrément planter le programme.

    C'est bien ça?

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Il y a d'autres détails dans cet article en anglais:
    http://blogs.msdn.com/oldnewthing/ar.../03/66660.aspx
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Par défaut
    Citation Envoyé par Difré91
    Et :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    toto* t1 = new toto[1];
    delete [] t1;
    fonctionne-t-il ??

    Si oui, quelle est la différence entre l'objet créé en faisant
    et
    ?

    Quand tu fais delete [] le compilateur doit etre capable de savoir combien de destructeurs il va appeler. Pour cela, et c'est a verifier en fonction du compilateur, celui ci peut par exemple reserver un entier supplementaire qui va etre juste avant l objet que tu reserves et qui va contenir ce nombre.


    essai quelque chose du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class A {};
     
    A * a = new A[666];
     
    int * b = (int *)a;
     
    --b;
     
    cout << *b;

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Citation Envoyé par Difré91
    Et :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    toto* t1 = new toto[1];
    delete [] t1;
    fonctionne-t-il ??
    Oui, un tableau à un élément est tout à fait valide.

    Citation Envoyé par Difré91
    Si oui, quelle est la différence entre l'objet créé en faisant
    et
    ?
    En terme de résultat aucun, mais en interne ça peut changer des choses, cf. la réponse de smashy juste au-dessus.

    Pourquoi se poser tant de questions ? La règle est simplissime, et il n'y a pas à chercher plus loin que ça :
    new delete
    new[] delete[]

  9. #9
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par Laurent Gomila
    La règle est simplissime, et il n'y a pas à chercher plus loin que ça :
    new delete
    new[] delete[]
    oui je sais, et je fais jamais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    toto * aa = new toto;
    delete [] aa ;
    Citation Envoyé par Laurent Gomila
    Pourquoi se poser tant de questions ?
    Et pourquoi pas? je trouve assez intéressant de savoir le fonctionnement de new et delete.
    Aprés ça ne tien qu'a moi
    merci pour les réponses

  10. #10
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2005
    Messages : 241
    Par défaut
    Bonjour,
    si vraiment la curiosité est forte ( qui a dit être maso?! ), tu peux redéfinir tes opérateurs globaux new et delete et même envisager de te créer ta propre gestion mémoire.
    Enfin, moi, j'ai eu la curiosité suffisamment forte pour faire ce genre de recherche.
    Là, tu auras nettement conscience que pour une allocation de type tableau ( et donc le delete[] ), il peut être pertinent de rechercher dans une table locale associant l'adresse à la taille alloué, pour justement libérer le bon espace mémoire.
    ( Si tu t'ennuies, jetes un coup d'oeil à l'implantation de malloc de Doug Lea, on imagine pas le travail nécessaire ).

    S. Desbois

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2008R2] Colonne DELETED, schéma Deleted ou autre ?
    Par Kropernic dans le forum Administration
    Réponses: 9
    Dernier message: 27/09/2013, 12h30
  2. TRIGGER INSTEAD OF DELETE et DELETE ON CASCADE
    Par stephane.julien dans le forum Développement
    Réponses: 5
    Dernier message: 22/06/2011, 17h50
  3. Différence entre delete et delete []
    Par deubelte dans le forum C++
    Réponses: 39
    Dernier message: 30/05/2011, 10h33
  4. différence entre delete et delete[]
    Par deubelte dans le forum C++
    Réponses: 7
    Dernier message: 25/02/2009, 03h30
  5. [langage] delete de fichier
    Par lolive dans le forum Langage
    Réponses: 2
    Dernier message: 24/04/2003, 15h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo