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 :

Libération mémoire d'objet dynamique


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 42
    Par défaut Libération mémoire d'objet dynamique
    Bonjour,

    comme cela est dit dans le titre, j'ai un probleme avec la libération d'objet dynamique en C++. Soit je ne sais pas utiliser la fonction soit je ne sais pas d'où vient l'erreur. L'erreur est toujours la meme pour ceux qui code...
    Debug Assertion Failed!

    Program:...
    File: dbgdel.cpp
    Line 52

    Expression:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
    (je vous met l'erreur des fois que ca veuille dire quelque chose pour quelqu'un!)
    Je vous met un bout de code pour que cela soit plus compréhensible pour vous. je vous en remercie par avance!

    Dans la bibliothèque:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ....
    student *ListStudent[100];    // un tableau de 100 pointeurs sur student
    ....
     
    Ma fonction:
    void CourseSection::RemoveAllStudent()
    {
    	for(int i=0;i<NumberStudent;i++)    // boucle pour passer par chacun des éléments
    	{
    		delete ListStudent[i];     // je fais la libération mémoire
    	}
    	NumberStudent=0;    // un compteur
    }
    dans mon main(pour tester)
    je déclare un student avec la fonction new...cela marche bien car j'arrive à l'utiliser et je fais pointé ListStudent[NumberStudent] sur chaque student que je crée dynamiquement. Ce problème est assez embetant car j'utilise le delete aussi pour ma fontion destrutor, et dans une fonction OneRemove...

    N'hesitez pas si vous avez une solution ou une question....

    Je vous remercie beaucoup de votre aide!!

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 42
    Par défaut
    Merci à toi Davidbrcz,
    le "delete[] ListStudent; " s'est avéré bon pour mon constructor et mon RemoveAll().
    mais mon problème principale reste toujours présent! La fonction "delete [] Tab[ i ];" qui semble tout à fait être ce dont j'ai besoin pour ma fonction OneRemove()... me retourne toujours la même erreur...
    le code est toujours le meme que précedemment sauf que que j'ai déclaré mon tableau de de pointeur sur student en dynamique


    student **ListStudent; //declaration de ma liste de student

    ListStudent=new student * [100]; // allocation de 100 pointeurs sur student

    student *NewStudent=new student; // allocation d'un student
    Je declare chaque student dans un sous prog comme au dessus et je retour NewStudent pour l'enregistrer dans mon tableau de ListStudent[i].

    Une question au passage:
    Est ce que le "delete [] Tab;", pris dans le lien que Davidbrcz m'a donné, à lui tout seul supprimer toute mes allocations?pour moi non...et dans ce cas la, ca veut dire que ma fonction destructor et RemoveAll ne sont pas complète....j'en revient à mon problème où je doit libérer delete[] ListStudent[i].....

    Merci pour votre lumière!

  4. #4
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    te détruit toutes les objets de ton tableau un à un.
    car
    (FAQ):
    delete [] se charge d'appeler le destructeur de chaque objet du tableau.
    Ta méthodes devient alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void CourseSection::RemoveAllStudent()
    {
    delete[] ListStudent;
    }
    Et ctout.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  5. #5
    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
    Euh...

    Tu me permettras d'avoir des doutes, là.
    ListStudent est de type student * [100], c'est-à-dire un tableau de pointeurs bruts.
    delete[] sur un tableau de pointeur bruts désalloue le tableau, mais ne fait en aucun cas un delete sur chaque pointeur!

    En effet, le "destructeur" d'un pointeur brut ne fait rien.
    S'il était question de pointeurs intelligents, là par contre il en serait autrement...
    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.

  6. #6
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 42
    Par défaut
    J'ai modifié mon student *[100] par un student **
    Sinon mon problème persiste toujours pour la supprimer d'un seul élément du tableau....
    Le delete d'un pointeur ListStudent[i](qui est un student *) ne fonctionne pas.

  7. #7
    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 faut voir comment tu alloues tes student, et comment tu remplis ton tableau.
    De plus, je conseille d'initialiser tous les pointeurs du tableau à NULL lors de l'allocation, et de remettre immédiatement à NULL un pointeur après son delete.
    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.

  8. #8
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 42
    Par défaut
    Oui j'initialise tout les pointeurs à null juste après l'allocation avec une boucle for!

    code: (en version simplifié!)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    student*   AddStudent()
    {
         student *NewStudent=new student;  // allocation de mon student
         ...
         return NewStudent;
    }
     
    Main()
    {
    ....
    ListStudent[i]=AddStudent();
    ....
    }
    Pour moi il n'y a aucune erreur....

  9. #9
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Déjà une question.

    Pourquoi n'utilises tu pas plutôt std::vector<student*> au lieu de te farcir un tableau à la main ?

  10. #10
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 42
    Par défaut
    Parceque je ne sais même pas ce que c'est mais c'est une piste à étudier!!Le problème c'est que cela m'est imposé d'utiliser un tableau...

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    Par défaut
    Ta fonction AddStudent() est extrèmement dangereuse codée comme cela en effet comme elle renvoie un pointeur sur un objet alloué localement, si tu ne le récupère pas (le pointeur) tu auras forcément une fuite mémoire. Le seul moyen de renvoyer un "pointeur" de manière propre est de renvoyer un pointeur intelligent. Je ne comprend pas pourquoi dans ton main tu ne fais tout simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListStudent[i]=new student();

  12. #12
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 42
    Par défaut
    parcequ'en fait j'ai plein de truc à faire pendant la création d'un student....mettre nom, prenom, adresse, mail....etc...si je le fais dans mon main c'est moins propre...

  13. #13
    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
    Citation Envoyé par CedricMocquillon Voir le message
    Ta fonction AddStudent() est extrèmement dangereuse codée comme cela en effet comme elle renvoie un pointeur sur un objet alloué localement, si tu ne le récupère pas (le pointeur) tu auras forcément une fuite mémoire. Le seul moyen de renvoyer un "pointeur" de manière propre est de renvoyer un pointeur intelligent. Je ne comprend pas pourquoi dans ton main tu ne fais tout simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListStudent[i]=new student();
    N'importe quoi...

    Donc pour toi, toute fonction retournant directement le résultat d'une allocation dynamique est "dangereuse" ?
    On est en C++ ici, pas en java: Les programmeurs sont censés savoir qu'ils utilisent une fonction qui retourne un pointeur alloué dynamiquement...
    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.

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    Par défaut
    "dangereuse" est effectivement peut être un peu excessif (d'autant que j'ajoutais "extrèmement"), il n'empêche que l'utilisation de "AddStudent();" tel quel ne provoque pas d'erreur de compilation ni même un warning et qu'il faut donc l'utiliser avec attention et s'assurer de récupérer à chaque fois l'objet créé dynamiquement en local. L'utilisation d'un smart pointeur permet de pallier aux erreurs d'inatention puisque dans ce cas l'objet renvoyé sera détruit (compteur de référence à zéro).
    Effectivement on peut dire que le programmeur est en C++ et qu'il est sensé savoir ce qu'il fait, il n'empêche que je préfère voir quelqu'un utiliser un vecteur plutôt qu'un tableau.

    PS: je ne suis pas non plus complètement obtu sur l'utilisation des tableaux ou des fonctions renvoyant un objet alloué localement, juste prudent quand j'en voie.

  15. #15
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 42
    Par défaut
    Il n'y a aucun probleme avec mon return dans ma fonction de AddStudent(), car j'utilise par la suite tout les student que j'ai déclaré(dynamiquement) pour modifier ou afficher des valeurs!!!

    Je ne voit vraiment pas d'où vient mon problème....et apparement je ne suis pas le seul...Je vous remercie quand de vous pencher sur mon problème!

    Mon problème vient du fait que je n'arrive pas à supprimer la deuxième dimension de mon tableau...je n'ai pas d'erreur pour "delete[] ListStudent" donc pour libérer les pointeurs de student mais j'en ai pour "delete[] ListeStudent[i]" pour libérer les student(ce qui est plus important que la libération des pointeurs à 2 octets!)

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    Par défaut
    Salut, effectivement, désolé, on s'était un peu éloigné de ton problème, voici une solution qui fonctionne avec les vecteurs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    #include <iostream>
    #include <vector>
     
    using namespace std;
     
    struct student
    {
    	int val;
    	student()
    	{
    		val=rand()%100;
    	}
    };
     
     
    vector<student*> ListStudent;
     
    void RemoveAllStudent()
    {
    	int NumberStudent = 100;
    	for(int i=0;i<NumberStudent;i++)    // boucle pour passer par chacun des éléments
    		delete ListStudent[i];     // je fais la libération mémoire
    	ListStudent.clear();
    	NumberStudent=0;    // un compteur
    }
     
    student* AddStudent()
    {
    	student* NewStudent = new student;
    	return NewStudent;
    }
     
    int main (void)
    {
    	ListStudent.resize(100);
    	for (int i=0; i<100; ++i)
    		ListStudent[i] = AddStudent();
     
    	for (int i=0; i<100; ++i)
    		cout << ListStudent[i]->val << ' ';
     
    	RemoveAllStudent();
    	cout << endl << ListStudent.capacity() << endl;
    	return 0;
    }
    Par contre, je n'ai pas trouvé comment obliger le vecteur à désallouer complètement la mémoire qu'il a réservé.

  17. #17
    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
    Bonjour,
    Citation Envoyé par CedricMocquillon Voir le message
    Par contre, je n'ai pas trouvé comment obliger le vecteur à désallouer complètement la mémoire qu'il a réservé.
    Il le fera tout seule lors de sa destruction. Il garde la memoire pour une utilisation futur. Histoire d'evité une nouvelle allocation memoire.
    Sinon tu devrait pourvoir faire
    ListStudent.reserve(0);

  18. #18
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 42
    Par défaut
    desole pour le retard j'étais au chute du Niagara et à toronto pendant quelques jours....
    Je vous remercie beaucoup pour votre aide...l'échéance de mon rapport étant tombée je n'ai pas utilisé les vectors mais j'ai laissé mon problème avec les delete en le spécifiant!En revanche ayant déjà un autre projet je vais directement commencer avec les vectors(un outils que je ne connaissait pas avant...)

    Merci beaucoup!

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 15/07/2008, 20h34
  2. [debutant nul] libération mémoire tableaux dynamiques
    Par hibiscuit dans le forum Débuter
    Réponses: 11
    Dernier message: 11/09/2007, 14h46
  3. Réponses: 3
    Dernier message: 14/03/2006, 05h19
  4. [FLASH MX2004] Création d'objet dynamiquement
    Par noarno dans le forum Flash
    Réponses: 3
    Dernier message: 15/12/2004, 11h00
  5. Evenement sur objet dynamique
    Par CanardJM dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 19/11/2004, 13h56

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