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 sur un tableaux d'objets


Sujet :

C++

  1. #1
    Membre éclairé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2004
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 477
    Par défaut Delete sur un tableaux d'objets
    Bonjour,

    J'aimerai savoir comment faire un delete propre pour supprimer tous les objets de tabResult?
    En fait je crée un tableau d'objets, dans lequel j'insère des objets.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    TCompareResult * tabResult;
    TCompareResult tabResult = new TCompareResult[nbCombinaison];
     
    result = new TCompareResult();
    tabResult[indexCombinaison] = * result;
    Ps: Comment faire une allocation propre, c'est à dire savoir si le new a bien fonctionné?

    Merci

  2. #2
    Membre émérite

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Par défaut
    Tout est expliqué dans la FAQ ici : http://c.developpez.com/faq/cpp/?pag...EURS_new_array

    Accessoirement ton code est faux je ne vois pas vraiment où tu veux en venir...

  3. #3
    Membre éclairé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2004
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 477
    Par défaut
    D'accord merci mais que se passe t-il si les objets intégrer dans mon tableau n'ont pas de destructeur ?

  4. #4
    Membre averti
    Inscrit en
    Décembre 2002
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 55
    Par défaut
    Quand il n'y a pas de destructeur défini, le destructeur par defaut est appellé.

    JC

  5. #5
    Membre éclairé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2004
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 477
    Par défaut
    Et que détruit le destructeur dans ce cas la ?

  6. #6
    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
    Il appelle le destructeur des données membres si elles en ont, et celui de la classe mère s'il y en a une.

  7. #7
    Membre averti
    Inscrit en
    Décembre 2002
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 55
    Par défaut
    ... et donc si tu as des objets dont des membres sont des pointeurs sur des instances ( via new ), ce sont les pointeurs qui sont detruits par le constructeur par defaut, pas les objets instanciés --> mauvaise gestion mémoire --> toujours bien redefinir un destructeur (virtuel (cfr faq)). Je pense que tu trouveras des infos plus detaillées dans la FAQ.


    A++

    JC

  8. #8
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    result = new TCompareResult();
    tabResult[indexCombinaison] = * result;
    Cette portion de code ne sert absolument à rien si ce n'est créer une fuite mémoire et réaliser une initialisation et une copie inutiles.

  9. #9
    Membre éclairé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2004
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 477
    Par défaut
    Pourquoi ce code génèrait une fuite mémoire ?
    La je ne comprends pas, le code est propre non ?

  10. #10
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Parce que la mémoire allouée par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result = new TCompareResult();
    N'est plus référencée nulle part a priori, il est donc impossible de la libérer.

    le code est propre non ?
    Oulah, non, loin de là.
    C'est du grand n'importe quoi. Et faire du code propre, c'est quelques niveaux au dessus que de faire du code qui ait du sens.

    La solution la plus propre est probablement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<TCompareResult> tabResult(nbCombinaison);

  11. #11
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par loufoque
    La solution la plus propre est probablement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<TCompareResult> tabResult(nbCombinaison);
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    std::vector<TCompareResult> tabResult;
    tabResult.reserve(nbCombinaison);
     
    tabResult.push_back(....)
    ou utiliser une structure qui n'a pas besoin de stocker tout ca et agit sur chaque combinaison tour a tour.

  12. #12
    Membre éclairé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2004
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 477
    Par défaut
    Et si je fais un delete sur la variable result après son utilisation, le code reste impropre? Normalement la mémoire devrait être désallouée non ? je ne comprends pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if(result != NULL){
    delete result;
    result = NULL;
    }
    Ce code devrait être bon théoriquement non ?

  13. #13
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Si tu veux dire que tu utilises:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    result = new TCompareResult();
    tabResult[indexCombinaison] = * result;
    if(result != NULL){
      delete result;
       result = NULL;
    }
    Ce code est correct en ce sens qu'il a le resultat auquel tu t'attends vraissemblablement, mais il n'est neanmoins pas bon du tout. Allouer de la memoire dynamique pour y construire un object avec le constructeur par defaut, copier cet objet et ensuite liberer la memoire dynamique est un abus certain de celle-ci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tabResult[indexCombinaison] = TCompareResult();
    (Accessoirement, delete est bien defini si l'argument est NULL).

  14. #14
    tut
    tut est déconnecté
    Membre éclairé
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Par défaut
    Citation Envoyé par loufoque
    Oulah, non, loin de là.
    C'est du grand n'importe quoi. Et faire du code propre, c'est quelques niveaux au dessus que de faire du code qui ait du sens.

    La solution la plus propre est probablement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<TCompareResult> tabResult(nbCombinaison);
    pas très sympa...
    surtout que ta solution peut coûter cher si TCompareResult est long à copier...
    Faut connaitre le contexte avant de juger.

  15. #15
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    surtout que ta solution peut coûter cher si TCompareResult est long à copier...
    Où tu vois la moindre copie ?
    Il n'y aura copie qu'avec des push_back ou autres redimensionnements.
    Ou copie du vector lui-même, bien sûr.

  16. #16
    Membre éclairé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2004
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 477
    Par défaut
    Merci de toutes vos réponses, mais je ne comprends pas trop bien alors la notion d'allocation dynamique de mémoire.

    Quelle est la différence entre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TCompareResult * result = new TCompareResult();
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TCompareResult result;
    Dans les deux cas je peux utiliser les méthodes de mes classes. Seulement une fois j'utilise un point (result.test()) et l'autre fois j'utilise une fleche (result->test()).

    Merci de m'éclaircir parce que la je ne comprends plus trop!

  17. #17
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Dans un premier cas tu as un pointeur vers un objet dynamiquement alloué que tu dois libérer explicitement et dans le second cas tu as un objet alloué sur la pile.

  18. #18
    Membre éclairé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2004
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 477
    Par défaut
    et liberrer explicitement cela se traduit par un delete non ? Comme je l'ai montré précédemment!

  19. #19
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Précédemment tu ne faisais que libérer une copie.

  20. #20
    Membre éclairé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2004
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 477
    Par défaut
    Donc j'ai suivi vos conseil pour parader ma fuite de mémoire! J'utilise les vector mais maintenant lorsque je veu supprimer son contenu, la mémoire allouée (gestionnaire des tâches) reste la même.

    Voici ce que je fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //Création du vecteur
    tabResult.reserve(nbCombinaison);
    tabResult.push_back(TCompareResult());
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //Suppression du vecteur et du contenu
    tabResult.erase(tabResult.begin(),tabResult.end());
    tabResult.clear();

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. delete sur un tableau d'objets dans destructeur
    Par Mihnea24 dans le forum Débuter
    Réponses: 6
    Dernier message: 05/12/2008, 22h42
  2. delete[] seulement pour des tableaux d'objets?
    Par Crisanar dans le forum C++
    Réponses: 7
    Dernier message: 22/10/2005, 19h50
  3. Réponses: 2
    Dernier message: 19/08/2003, 18h04
  4. free sur des tableaux "a moitié dynamiques"
    Par barthelv dans le forum C
    Réponses: 4
    Dernier message: 31/07/2003, 15h30

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