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 :

Différence entre Free et Destroy


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 Différence entre Free et Destroy
    Bonjour,

    j'ai chercher sur internet et sur le forum mais je n'ai rien trouvé. Quel est vraiment la différence entre la méthode Free et Destroy. De ce que j'ai compris Free libère la mémoire (par exemple ce qui a été aloué dynamiquement) et Detroy détruit l'objet et donc son emprunte mémoire. Est-ce vraiment cela ?
    Avez vous un bout de code à montrer pour bien faire la différence ?

    Merci d'avance.

  2. #2
    Membre confirmé

    Inscrit en
    Novembre 2005
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2005
    Messages : 97
    Par défaut
    je pense que:

    destroy(objet):
    si objet aloué alors libreation_mémoire
    sinon erreur;

    free(objet):
    si objet aloué alors liberation_memoire
    sinon ne fé rien;(il est déjat libéré)

  3. #3
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    Non ce n'ets pas tout a fait ca
    En fait c'est seulement Destroy qui est responsable de la liberation de la memoire.
    C'est la seule fonction qui a une reele existance en soit.

    Le probleme de Destroy, c'est quelle cherche a liberer l'objet et la memoire pointee par la reference de l'objet.

    C'est a dire que ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Obj := Nil;
    Obj.Destroy;
    genere une erreur car obj pointe sur "rien".

    Pour eviter cela il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    If Obj <> Nil Then Obj.Destroy;
    Une fois qu'on a compris ca .... Ca va tout seul.
    Free fait pour toi le test "If Obj <> Nil".
    C'est a dire que Free verife avant de faire appel a destroy si la reference est bien valide.

  4. #4
    Expert confirmé

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Par défaut
    En fait, par habitude, on utilise toujours Free, et jamais Destroy. Jusqu'à maintenant, je suis passé par trois étapes de la compréhension du "pourquoi Free" :
    1. D'abord : c'est toujours plus sûr, puisqu'on le dit ;
    2. Ensuite : en fait ça sert à rien, si on code bien, on ne devrait jamais se retrouver dans une situation où on essaye de libérer nil ;
    3. Maintenant : ben si, ça sert, et drôlement ! Lorsqu'une exception est déclenchée dans le constructeur d'un objet, le destructeur est immédiatement appelé ; et souvent, dans le destructeur, on libère des objets composés... Mais si l'exception est survenue avant la création de l'objet... Ben ça fait boum Et les boums pendant qu'une exception est traitée... C'est très dangereux Et pourtant ça ne relève pas du tout d'une mauvaise programmation.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  5. #5
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    Je n'avais pas encore saisi le dernier point. Merci de m'en apprendre encore un peu plus

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 093
    Par défaut
    Une chose importante !

    Free est une méthode normale, elle est relative au pointeur de l'objet selon un offset fixe déterminé par TObject

    Destroy est une méthode virtuelle, elles est contenu dans la table des méthodes de la classe en cours !

    C'est pour cela que le test à nil est possible dans le free, car l'appel à free c'est juste un appel du genre TMethod(Objet + $08); ... alors que le Destroy c'est TMethod(Objet.MethodAddress('Destroy'); et l'accès à la Table des méthodes provoque une violation d'accès si l'objet n'a pas été instancié !
    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

  7. #7
    Expert confirmé

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Par défaut
    Citation Envoyé par ShaiLeTroll
    C'est pour cela que le test à nil est possible dans le free, car l'appel à free c'est juste un appel du genre TMethod(Objet + $08); ... alors que le Destroy c'est TMethod(Objet.MethodAddress('Destroy'); et l'accès à la Table des méthodes provoque une violation d'accès si l'objet n'a pas été instancié !
    En fait c'est pas tout à fait ça (même si ça a l'effet que tu dis).

    Pour Free, un appel à Obj.Free est transformé en Free(Obj), et pas Free(Obj + $08).

    Pour Destroy, ce n'est pas via la table des méthodes et donc MethodAddress qu'on le récupère, mais via la VMT. Ca donne quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MethodPtr := PPointer(Integer(Obj.ClassType) + vmtDestroy)^;
    MethodPtr(Obj);
    C'est donc le Obj.ClassType qui provoque une violation d'accès si Obj = nil.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

Discussions similaires

  1. Différence entre un "bidouilleur" et un Pro ?
    Par christ_mallet dans le forum Débats sur le développement - Le Best Of
    Réponses: 290
    Dernier message: 28/11/2011, 10h53
  2. Réponses: 7
    Dernier message: 02/04/2010, 13h32
  3. Différence entre Powerpack et Free : vaut-elle la peine ?
    Par iDaaX dans le forum Mandriva / Mageia
    Réponses: 3
    Dernier message: 11/11/2007, 15h53
  4. Différences entre jmp, jz, jnz, etc
    Par christbilale dans le forum Assembleur
    Réponses: 3
    Dernier message: 05/07/2002, 15h09
  5. Réponses: 3
    Dernier message: 07/05/2002, 16h06

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