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

 Delphi Discussion :

Non plantage sur un objet libéré


Sujet :

Delphi

  1. #1
    Membre éclairé
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Par défaut Non plantage sur un objet libéré
    Bonjour,

    voici mon problème.
    J'ai créer un objet contenant un integer, un string, un tableau d'entier.
    Je créer mon objet.
    Je le libère avec Free
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure TMaClass.Free ;
    begin
        // Libération du tableau d'entier et c'est tout
    end ;
    Ensuite si je faire MaClass.SetInteger(10) ça ne plante pas et j'arrive à récupérer la variable Integer.

    Par contre si je fais un MaClass.Free de nouveau, ça plante.

    Pour moi mon objet est libéré, mais je ne comprend pas ce comportement.

    Quelqu'un comprend-il ?

    Merci

  2. #2
    Membre Expert

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 296
    Par défaut
    Pourquoi avoir utiliser une procédure du même nom que la procédure Free (du TObject)?

    Essaie de changer son nom.

  3. #3
    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
    Bonjour,

    Premièrement il ne faut pas redéfinir la méthode Free pour effectuer des opération lors de la destruction mais le destructor Destroy.

    Ensuite, comme il y a un temps de latence entre la destruction et la libération effective de la mémoire, si la valeur contenant l'objet n'est pas mise à NIL après l'appel à Free, la variable reste utilisable pendant un court temps (mais c'est très casse-gueule comme situation).

    Pour s'assurer qu'on n'aura pas ce genre de chose, il faut détruire un objet avec FreeAndNil.

  4. #4
    Membre Expert Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Par défaut
    Citation Envoyé par Aka Guymelef Voir le message
    Bonjour,
    Ensuite, comme il y a un temps de latence entre la destruction et la libération effective de la mémoire, si la valeur contenant l'objet n'est pas mise à NIL après l'appel à Free, la variable reste utilisable pendant un court temps (mais c'est très casse-gueule comme situation).
    Si je n'm'abuse, ce n'est pas un temps de latence entre la destruction et la lberation effective de la memoire. Le Free va de-reserver cet espace memoire et c'est tout. Donc tout ce qui se trouvait a cet endroit y reste, jusqu'a ce que quelqu'un reseverve cet emplacement et le modifie.

  5. #5
    Membre éclairé
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Par défaut
    Ah, je me suis trompé, c'est Destroy qu'il faut redéfinir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    destructor Destroy; override;
    Je confondais avec la libération des fenêtres graphique où il faut appeler Free et non Destroy

    Merci de votre aide

  6. #6
    Membre Expert

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 296
    Par défaut
    Dans tous les cas il faut appeler Free (ou Release pour les fenetres), mais seul le destructeur Destroy est à surcharger.

    Destroy n'est pas à appeler directement.

  7. #7
    Membre éclairé
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Par défaut
    Est-ce qu'il faut faire un inherited Destroy; si on hérite de TObject ?

  8. #8
    Membre Expert

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 296
    Par défaut
    normalement (mais je n'ai pas eu d'erreur quand il m'est arrivé de l'oublier).

    Par contre bien le mettre à la fin.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    destructor Destroy;
    begin
    ....
    // Mon code
    .....
     
    inherited;
    end;

  9. #9
    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 guillemouze Voir le message
    Si je n'm'abuse, ce n'est pas un temps de latence entre la destruction et la lberation effective de la memoire. Le Free va de-reserver cet espace memoire et c'est tout. Donc tout ce qui se trouvait a cet endroit y reste, jusqu'a ce que quelqu'un reseverve cet emplacement et le modifie.
    En fait été assez imprécis quand j'ai parlé de "latence" désolé. Bien sûr ce n'est pas le destructeur qui génère une latence avant que l'objet ne soit effectivement détruit, il marque la zone mémoire précédemment utilisée comme étant ré-utilisable. Cependant tant que le programme ne décides pas de réutiliser cet espace, l'objet continue d'exister en mémoire. Donc la variable (et surtout le pointeur vers l'adresse mémoire qu'il y a derrière) continue de pointer l'objet détruit sauf si on lui affecte NIL. D'où FreeAndNil.

    Citation Envoyé par bubulemaster Voir le message
    Est-ce qu'il faut faire un inherited Destroy; si on hérite de TObject ?
    Pas acquis de conscience je dirais qu'il faut toujours appeler le destructeur hérité, néanmoins il faut bien prendre garde d'appeler l'inherited seulement à la toute fin du destructeur redéfinit.

Discussions similaires

  1. erreur méthode non gérée sur l'objet document
    Par belgariel dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 21/05/2010, 09h59
  2. Réponses: 10
    Dernier message: 23/10/2007, 14h02
  3. Réponses: 5
    Dernier message: 12/06/2006, 12h07
  4. debutant: un keyListener sur un objet non graphique
    Par ataya dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 18/05/2006, 18h45
  5. Methode non trouvé sur objet Graphics2D
    Par staive dans le forum 2D
    Réponses: 14
    Dernier message: 26/10/2005, 10h01

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