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 :

Procedure Free vs. Destructor Destroy


Sujet :

Langage Delphi

  1. #1
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 422
    Points : 238
    Points
    238
    Par défaut Procedure Free vs. Destructor Destroy
    Bonjour,

    En reprenant le code d'un autre développeur, j'ai vu qu'il avait implémenté des "Procedure MaClasse.Free;" en tant que destructeurs dans ses classes.

    Ayant eu des problèmes de plantages étranges à la destruction de ces classes, j'ai essayé de remplacer tous les "Procedure MaClasse.Free" en "Destructor MaClasse.Destroy". Miracle: plus aucun problème ni fuite mémoire depuis.

    D'où ma question : je pensais qu'implémenter un "Procedure MaClasse.Free" ou un "Destructor MaClasse.Destroy" revenait exactement au même, mais apparemement il y a une différence.

    Qqn en sait-il plus sur le processus de destruction des classes ?

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    un destructeur se déclare avec destructor, pas avec une procedure.

    ensuite Free est une méthode de TObject des plus simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TObject.Free;
    begin
      if Self <> nil then
        Destroy;
    end;
    il est donc possible d'appeler Free sur une variable objet contenant "nil", c'est le seul intérêt de cette méthode.

    Si tu crées une nouvelle fonction Free dans ton objet, tu fais disparaître cette fonctionnalité et éventuellement tu introduis des bugs...mais ça tu peux le faire aussi un un destructor.

    Quoi qu'il en soit, la bonne pratique c'est de surcharger le Destructor car celui-ci est virtuel, alors que la méthode Free est statique. ça veux dire que ta nouvelle méthode Free ne sera invoqué QUE si tu l'appliques a une variable déclarée avec ton type objet, alors que le destructeur surchargé sera toujours invoqué.

    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
     
    type
      TMonObject = class
        destructor Destroy; override; // toujours appelé
        procedure Free; // lié à TMonObject
      end;
     
    var
      o: TMonObjet;
      l: TObjectList;
    begin
      o := TMonOject.Create;
      l := TObjectList.Create;
      l.Add(o);
      l.Free; // détruit "o" en tant que "TObject", la méthode TMonObject.Free n'est jamais invoquée
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 422
    Points : 238
    Points
    238
    Par défaut
    Hello,

    Donc si je comprends bien le problème venait du fait que la procédure écrite par le développeur TMonObjet.Free masque la procédure de TObject.Free et du coup le Destroy se trouvant dans TObject.Free n'était jamais appelé et l'objet n'était pas libéré.

    Finalement on pourrait utiliser systématiquement TMonObjet.Destroy, le .Free n'était proposé que par facilité de codage.

    C'est bien ça ?

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 449
    Points : 24 856
    Points
    24 856
    Par défaut
    Un développeur doit redéfinir Destroy ET utiliser Free, c'est écrit ainsi dans l'aide :
    N'appelez pas directement Destroy. Appelez plutôt Free. Free vérifie que la référence objet n'a pas la valeur nil avant d'appeler Destroy.
    En général, c'est très utile le Free et surtout le FreeAndNil pour éviter des libérations involontaires sur des objets déjà libérés que l'on prend soin de passer à nil\NULL lors de lors 1ere libération

    En C++Buidler, on utilise le mot clé Delete qui se comporte comme Free en appelant le Destroy et protégeant aussi du NULL
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Citation Envoyé par MiJack Voir le message
    Hello,

    Donc si je comprends bien le problème venait du fait que la procédure écrite par le développeur TMonObjet.Free masque la procédure de TObject.Free et du coup le Destroy se trouvant dans TObject.Free n'était jamais appelé et l'objet n'était pas libéré.
    tout dépend de ce que fait TMonObjet.Free, s'il invoque Destroy l'objet sera détruit...mais si l'instance de TMonObjet est invoquée comme un TObject c'est TObject.Free qui sera appelé directement.

    Citation Envoyé par MiJack Voir le message
    Finalement on pourrait utiliser systématiquement TMonObjet.Destroy, le .Free n'était proposé que par facilité de codage.

    C'est bien ça ?
    techniquement oui, mais Embarcadero recommande l'usage de Free, comme ça il peuvent au besoin modifier la façon dont sont libérés les objets. Par exemple sans les détruire s'il y a un garbage collector...il me semble d'ailleurs que c'est ce qui a été fait pour Delphi .Net
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 422
    Points : 238
    Points
    238
    Par défaut
    OK merci pour vos explications.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 02/04/2010, 13h32
  2. Masquer la procedure TObject.Free ?
    Par Bruno75 dans le forum Langage
    Réponses: 11
    Dernier message: 20/07/2009, 17h30
  3. Probleme chez Free lors de la procedure de demanagement
    Par candice9 dans le forum Dépannage et Assistance
    Réponses: 2
    Dernier message: 18/08/2008, 16h32
  4. Free & destroy : différence?
    Par nostroyo dans le forum Langage
    Réponses: 3
    Dernier message: 10/07/2008, 10h38
  5. Différence entre Free et Destroy
    Par bubulemaster dans le forum Delphi
    Réponses: 16
    Dernier message: 30/05/2007, 17h39

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