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

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 16
    Points : 10
    Points
    10
    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 averti 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
    Points : 346
    Points
    346
    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 à l'essai
    Inscrit en
    Février 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 16
    Points : 10
    Points
    10
    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
    Points : 1 181
    Points
    1 181
    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 chevronné

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    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 à l'essai
    Inscrit en
    Février 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 16
    Points : 10
    Points
    10
    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 chevronné

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

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

  8. #8
    Membre à l'essai
    Inscrit en
    Février 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 16
    Points : 10
    Points
    10
    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

  9. #9
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    En fait il faut aussi savoir que l'exception "invalid pointer operation" au moment d'un Free signifie que l'objet en question a déjà été libéré et détruit !

    Ca montre un problème dans la gestion des instanciation/destruction : soit l'instance est partagée entre plusieurs objets et chacun essaie de le détruire de son côté. C'est le cas que tu as rencontré.

    Soit l'objet a effectivement été détruit, mais le pointeur sur l'instance n'a pas été redéfini à NIL après la première destruction. Dans ce cas, par la suite on ne sait pas que l'objet a été détruit et on risque un Access violation si on essaie de s'en servir...

  10. #10
    Membre à l'essai
    Inscrit en
    Février 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    Tout à fait, je comprends bien, la destruction d'objets et une notion nouvelle pour moi venant du développement java où le dieu Garbage Collector s'occupe de ça pour nous.
    Mais merci pour cette explication

    A bientôt pour la nouvelle question, qui ne devrait pas tarder vu que je me suis mis a Delphi depuis qu'un petit mois

+ 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