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 397
    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 397
    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