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 :

Destruction des objects


Sujet :

Langage Delphi

  1. #21
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 218
    Points : 311
    Points
    311
    Par défaut
    Au point où tu en es tu pourrais ptet essayer d'inclure un outil comme Memcheck ou MemProof, ca t'aiderait rapidement à trouver les fuites mémoire, s'il y en a.

    http://delphi.developpez.com/freewar...Point#MemCheck

    Pour Paul et Shai pas de souci depuis le temps que je vous lis, je commence à connaitre vos niveaux grands JEDI de Delphi.

  2. #22
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 534
    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 534
    Points : 25 082
    Points
    25 082
    Par défaut
    lio908, tu as bien mis override pour chaque destructor surchargé ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    type
      TPoint = class
      ...
      public
        constructor Create...
        destructor Destroy; override;
        ...
      end;
    Différence entre un code boucle, utilisant une variable temporaire qui force le type et une boucle sans variable temporaire (correspondant à ce que fait le TObjectList)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var
       Point: TPoint;
     
    ...
           begin
             Point := self.ListePoint.Items[indexPoint] as TPoint;
             Point.Free; // Appel du destructeur de l'object ou Free car c'est un point
          end;
    Dans le code, ci-dessus, on sait que Point est un TPoint, le Free va appeler le Destroy du TPoint, tout va bien, c'est fortement type !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    var
    ...
           begin
             self.ListePoint.Items[indexPoint].Free; // Appel du destructeur de l'object ou Free 
          end;
    Dans le code, ci-dessus, Free va appeler le Destroy de l'instance, pour cela il va regarder son ClassType qui va lui fourni la table des méthodes virtuelles (VMT).

    Mauvais Cas, oubli de l'override
    Destroy n'est pas indiqué comme override, Destroy existe dans la VMT pour TObject uniquement, tu dois surement avoir un message
    "La méthode 'Destroy' cache la méthode virtuelle de la classe de base 'TObject'", cela compile, mais cela pose problème à l'exécution car lors de l'appel Free, il n'y a pas le Destroy de TPoint dans sa VMT mais le Destroy de TObject ! Il n'appele donc jamais le Destroy de TPoint, donc libération manquante !

    Bon Cas, override bien mis !
    Destroy existe dans la VMT pour TObject et pour TPoint, lorsque tu fais un Free, il va trouver le Destroy de TPoint, et là tes objets seront libérés !

    La TObjectList manipule des TObject, on est dans le cas ci-dessus, sans override, la libération est incorrecte !
    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

  3. #23
    Membre régulier
    Homme Profil pro
    Automaticien
    Inscrit en
    Décembre 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 149
    Points : 73
    Points
    73
    Par défaut Ca avance...
    Effectivement avec le override c'est mieux.

    En pas a pas(F7) je rentre dans les destroy a partir de mes listes mais pendant la destruction des points, au bout d'un moment, j'ai
    EStackOverflow, 'Débordement de pile'

  4. #24
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 534
    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 534
    Points : 25 082
    Points
    25 082
    Par défaut
    tu n'as pas oublié Inherited devant Destroy dans tes destructor

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    destructor TGroupe.Destroy;
    begin
       ...
     
       inherited Destroy; // sans l'inherited, cela donne une récursivité, une EStackOverflow indique un recurisivité trop profondre !
    end;
    En fait, tu devrais reprendre les cours POO de Delphi, chaque mot clé à son importance, on a réussi à faire un débat de 2 pages rien que pour l'oubli de override !

    Tu as bien enlevé TOUTES les boucles sur TObjectList, laissant OwnObjects faire son travail automatiquement ?
    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. #25
    Membre régulier
    Homme Profil pro
    Automaticien
    Inscrit en
    Décembre 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 149
    Points : 73
    Points
    73
    Par défaut Ca marche
    Tout est détruit et tout se libère
    J'avais laissé un destroy en plus de devant le inherited Destroy;

    Merci a tous, je solde le sujet mais...
    A bientôt

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Sauvegarder des Objects dans un fichier
    Par developpeurFou dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 11/05/2006, 23h33
  2. pchar et Tlist à la destruction des pchar
    Par bjl dans le forum Langage
    Réponses: 5
    Dernier message: 06/01/2006, 15h31
  3. JAVA - Passer des Objects à des méthodes
    Par canou94 dans le forum CORBA
    Réponses: 2
    Dernier message: 15/11/2005, 22h39
  4. Conditions de destruction des instances de classes
    Par elvivo dans le forum Général Python
    Réponses: 4
    Dernier message: 29/12/2004, 17h16

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