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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Automaticien
    Inscrit en
    Décembre 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 149
    Par défaut Destruction des objects
    Bonjour
    Je continue mon apprentissage...

    J'en suis à la destruction de mes objects.
    mais j'ai le message suivant sur le free de point
    "opération de pointeur incorrecte"

    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
    17
    18
    19
    20
    destructor TGroupe.Destroy;
    var
       indexPoint: integer;
       Point: TPoint;
       indexCouleur: integer;
       Couleur: TCouleur;
       indexFace: integer;
       face: TFace;
    begin
       // 1 destruction des objects de la listePoint
       For indexPoint := self.ListePoint.Count - 1 DownTo 0 Do
       Begin
          If self.ListePoint.Items[indexPoint] <> Nil Then
          begin
             Point := self.ListePoint.Items[indexPoint] as TPoint;
             Point.Free; // Appel du destructeur de l'object ou Free car c'est un point
          end;
          self.ListePoint.Delete(indexPoint); // Suppression de l'élément dans la liste
       End;
       Self.ListePoint.Free; // Détruit la liste
    Mon groupe à une liste de d'objects points et le groupe fait partie lui-meme d'une listeGroupe dans un object Fichier

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    rien ne me saute aux yeux...mais

    si ListePoint est un TObjectList, il suffit de faire ListPoint.Free

    d'autre part, ton erreur est peut-être dans la façon dont tu charges ta liste

    et pour finir, avec un destructor virtuel, tu n'as pas besoin de connaître le type de l'objet pour le détruire
    ListePoint[PointIndex].Free
    ou
    TObject(ListePoint[PointIndex]).Free
    suffira (en ajoutant un "override" sur le destructor de TPoint s'il en possède un)
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 149
    Par défaut
    si ListePoint est un TObjectList, il suffit de faire ListPoint.Free
    Cela détruira aussi les objects point de la liste?

    Si j'ai bien compris, il faut
    1 Détruire l'objects
    2 Retirer l'object de la liste

    3 puis quand liste vide, detruire la liste

    Si je met point.destroy c'est pareil que point.free mais dans system, dans Objet.destroy il y a rien entre begin et end???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    destructor TObject.Destroy;
    begin
    end;
     
    procedure TObject.Free;
    begin
      if Self <> nil then
        Destroy;
    end;
    que ce passe t il alors?

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

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 149
    Par défaut
    Tjs pb de destruction d'objet sur le self.listeGroupe.free avec comme message:
    "opération de pointeur incorecte"

    Premier destructeur
    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
    17
    destructor TFichier.Destroy;
    var
       indexGroupe: integer;
       Groupe: TGroupe;
    begin
       // 1 destruction des objects groupe de la listeGroupe de l'objet fichier
       For indexGroupe := self.ListeGroupe.Count - 1 DownTo 0 Do
       Begin
          If self.ListeGroupe.Items[indexGroupe] <> Nil Then
          begin
             Groupe := self.ListeGroupe.Items[indexGroupe] as TGroupe;
             Groupe.Destroy; // Appel du destructeur de l'object
          end;
       End;
       self.ListeGroupe.Free; // Détruit la liste
       inherited Destroy;
    end;
    second destructeur ou il n'y a pas de message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    destructor TGroupe.Destroy;
    var
       indexPoint: integer;
       Point: TPoint;
       indexCouleur: integer;
       Couleur: TCouleur;
       indexFace: integer;
       face: TFace;
    begin
     
       self.ListePoint.Free;
       self.ListeCouleur.Free;
       self.ListeFace.Free;
       exit;
    et en partant du principe que le liste.free detruit objects et liste?
    A+

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    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 086
    Par défaut
    Citation Envoyé par lio908 Voir le message
    Si j'ai bien compris, il faut
    1 Détruire l'objects
    2 Retirer l'object de la liste
    3 puis quand liste vide, detruire la liste
    En fait, tu as mal compris, l'utilité de OwnObjects de la TObjectList

    ne jamais utilise Destroy !
    c'est uniquement dans le cas du override (inherited Destroy) que tu peux l'utiliser !

    Enfin, si ListeGroupe est une TObjectList, suffit de la créer en OwnObjects à True, cette liste détruira les objets automatiquement !
    Tu n'as pas besoin de faire ta boucle dans ce cas !

    Surtout pas de Exit dans un destructeur !
    la dernière opération doit être toujours "inherited Destroy", dans le destructor, dans la cas contraire, cela peut provoquer de nombreuses erreurs dont une RunTime error 216 dans les finalization lors que l'on oublie le "inherited Destroy" d'un TComponent (à cause de Owner qui tente de libérer un objet qui l'est déjà)
    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

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par lio908 Voir le message
    ...

    Si je met point.destroy c'est pareil que point.free mais dans system, dans Objet.destroy il y a rien entre begin et end???
    ...
    blah blah blah !

    prend le temps de lire un tuto sur les bases du langage Delphi, tu gagneras du temps.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Membre expérimenté
    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
    Par défaut
    Outre ce qui a été dit sur le destroy

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If self.ListeGroupe.Items[indexGroupe] <> Nil Then
    Il vaut mieux éviter de tester le nil et utiliser la méthode Assigned pour tester l'existence d'un objet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     if Assigned(self.ListeGroupe.Items[indexGroupe] ) then
    ...
    Pour libérer un objet il vaut mieux utiliser la méthode FreeAndNil quand elle est disponible.

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

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 149
    Par défaut
    Merci des réponses,
    je testerais ce soir dés rentré du boulot

    le exit; dans le destructeur était pour éviter de tous effacer pendant les essais
    A+

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par macumba Voir le message
    Outre ce qui a été dit sur le destroy

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If self.ListeGroupe.Items[indexGroupe] <> Nil Then
    Il vaut mieux éviter de tester le nil et utiliser la méthode Assigned pour tester l'existence d'un objet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     if Assigned(self.ListeGroupe.Items[indexGroupe] ) then
    ...
    en quoi est-ce mieux ?

    Citation Envoyé par macumba Voir le message
    Pour libérer un objet il vaut mieux utiliser la méthode FreeAndNil quand elle est disponible.
    Sauf que Free est là justement pour pouvoir être invoqué sans dommage sur un pointeur nul; le test ne sert donc à rien.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 149
    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'

  11. #11
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    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 086
    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

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

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 149
    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.

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