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 de mémoire


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut Libération de mémoire
    Bonjour,

    J'ai un pb qui survient lors de la libération de mémoire
    allouée pour les objets d'une classe, mais je n'arrive absolument pas à
    savoir pourquoi, (lorsque je quitte l'appli un message d'erreur
    de Windows s'affiche).

    Le code étant extrêmement long et compliqué je vais simplifier.
    La classe en question alloue un tableau d'objets lors de sa
    création:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    MaClasse(int taille) 
      {
        pObj = new Obj[taille];
        ...
      }
    et libère la mémoire allouée lors de sa destruction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ~MaClasse(){delete[] pObj;}
    Quelque part dans une autre classe 2 objets MaClasse sont créés:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MaClasse *p1 = new Maclasse(50);
    MaClasse *p2 = new Maclasse(50);
    et sont détruits dans le destructeur de cette même autre classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    delete p1;
    delete p2;
    Le pb apparement vient qu'il y a 2 instanciations/libérations.
    Si je n'instancie qu'un seul objet je n'ai pas d'erreur
    lors de la désallocation.

    Est ce que quelqu'un aurait eu ce genre de pb ou aurait
    une idée ?


    D'avance merci.

  2. #2
    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
    Ta classe gère la durée de vie d'une ressource, tu as donc d'autres critères à vérifier:
    • soit elle doit être explicitement non-copiable et non-assignable (constructeur de copie et opérateur d'affectation déclarés privés et non-définis),
    • soit elle est copiable, et doit donc avoir un constructeur de copie (et un opérateur d'affectation aussi, si elle est assignable) clairement défini. Si elle possède aussi un opérateur d'affectation, je conseille l'idiome copy-and-swap.

    De plus, pour être parfaitement exception-safe, ta classe ne doit gérer "elle-même" la durée de vie que d'une seule ressource. (en gros, un seul new dans le corps du constructeur, un seul delete dans le corps du destructeur).
    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.

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Le code que tu montres n'as pas de raison à priori de ne pas fonctionner. Donc, je pense comme Medinoc: quelque part tu dois avoir une copie de ta variable et ceci n'est pas gérer correctement.

  4. #4
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut
    Oui je crois qu'en effet la classe (celle qui alloue un tableau) n'est pas en cause.
    J'ai déjà effectué un 1er traçage mais je n'ai rien remarqué de suspect.
    C'est vrai que le code est long et complexe, je pense qu'il faut donc que je surveille le code pas à pas mais bon, pas évident...

    Si quelqu'un à une idée/intuition qu'il n'hésite pas.

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Ben l'idée, c'est ce qu'à dit Médinoc au début: l'opérateur = et le constructeur par copie sont-ils gérés? Probablement non, et l'erreur est ici.

  6. #6
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut
    L'opérateur = et le constructeur par copie ne sont effectivement pas
    gérés, mais le truc c'est qu'ils ne sont pas utilisés dans mon code (enfin je crois).
    Tout se déroule (en gros) comme dans l'exemple que j'ai donné plus haut, aussi je ne pense pas que l'opérateur = et le constructeur par copie interviennent dans ce genre de code (mais je peux me tromper )

Discussions similaires

  1. Réponses: 7
    Dernier message: 27/05/2006, 13h30
  2. Problème libération de mémoire?
    Par Bartuk dans le forum C
    Réponses: 7
    Dernier message: 28/12/2005, 17h20
  3. Libération de mémoire
    Par petitcoucou31 dans le forum Langage
    Réponses: 1
    Dernier message: 16/09/2005, 14h10
  4. [Debutant(e)]problème de libération de mémoire
    Par skywalker3 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 10/02/2005, 17h38
  5. Réponses: 25
    Dernier message: 16/07/2003, 20h41

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