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

Langage Delphi Discussion :

POO - Operation de pointeur incorrect sur Free


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 16
    Par défaut POO - Operation de pointeur incorrect sur Free
    Bonjour,

    J'ai un pti souci de libération de mémoire,

    Je dispose d'un objet de class A n'ayant que des propriétés de type primitives (integer et boolean)

    et un objet de Class B ayant comme propriété un objet de class A.

    J'ai donc surchargé le destructeur de B pour détruire son instance de A comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    destructor B.destroy;
    begin
     
    //j'ai rajouté cette ligne suite a mon problème pour vérifier que A n'est pas null, cette ligne passe sans problème
    A.fNom := 'hijhkj';
     
    //ligne causant le problème
    A.Free;
     
    inherited;
    end;
    mais quand j'apelle A.Free , j'ai le droit a un EInvalidPointer: Opération de pointeur incorrect oO

    Quelqu'un aurait-il une idée d'où pourrait provenir le souci?

    D'avance merci

  2. #2
    Membre éclairé Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Par défaut
    est-ce que "inherited" ne devrait pas se trouver en début de destructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    destructor B.destroy;
    begin
    inherited; 
    //j'ai rajouté cette ligne suite a mon problème pour vérifier que A n'est pas null, cette ligne passe sans problème
    A.fNom := 'hijhkj';
     
    //ligne causant le problème
    A.Free;
     
     
    end;
    sans aucune conviction

  3. #3
    Membre averti
    Inscrit en
    Février 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 16
    Par défaut
    même résultat, des que j'appele free

  4. #4
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Par défaut
    Est ce qu'on peut avoir le code de destruction de la classe A.
    Car à mon avis, c'est là que le problème se pose.

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par zemeilleurofgreg Voir le message
    est-ce que "inherited" ne devrait pas se trouver en début de destructeur :
    Règle d'or : toujours appeler le destructeur hérité en dernier

    Sinon moi j'aimerais également savoir comment est instancié A.

  6. #6
    Membre averti
    Inscrit en
    Février 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 16
    Par défaut
    Et bien ma classe A hérite tout simplement de TObject

    et comme elle ne contient que des propriété de type integer ou boolean
    je n'ai pas surchargé le destructeur

  7. #7
    Membre Expert

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Billets dans le blog
    1
    Par défaut
    Et comment l'instancies-tu ?

  8. #8
    Membre averti
    Inscrit en
    Février 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 16
    Par défaut
    Bon, j'viens de résoudre mon problème,j'avais juste fait une grossière erreur.

    D'une, j'avais une liste d'objet contenant des objet de type A.

    et mon instance de A dans mon Objet B, pointé en fait un objet de cette liste

    du coup quand j'appelais A.free dans le destructeur de B, çà foutait un peu le souk car çà libérait aussi mon instance de A dans la liste d'objet!

    J'ai donc résolu le problème, en faisant une copie de mon instance de A et c'est cette copie que j'affecte à mon Objet B, et la, plus de problème, tout se passe correctement.

    On réfléchi mieux l'estomac plein^^

    Somme toute, merci de vous être penché sur mon problème

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

Discussions similaires

  1. Query.open -> Operation de pointeur incorrecte
    Par fredfred dans le forum Langage
    Réponses: 4
    Dernier message: 13/09/2013, 12h11
  2. besoin de comprehension sur free() et pointeur
    Par leprofmelo dans le forum C
    Réponses: 44
    Dernier message: 22/11/2007, 10h22
  3. Réponses: 4
    Dernier message: 04/08/2005, 14h15
  4. pointeur multiple sur un objet
    Par Arnaud-h dans le forum C++Builder
    Réponses: 9
    Dernier message: 02/06/2004, 11h33
  5. mysqldump sur free
    Par bouba64 dans le forum Administration
    Réponses: 4
    Dernier message: 15/07/2003, 17h10

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