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. #1
    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 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 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 448
    Points
    28 448
    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 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
    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 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
    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 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
    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 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 448
    Points
    28 448
    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 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
    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 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
    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 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 448
    Points
    28 448
    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 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
    Free libère le pointeur et rend l'emplacement mémoire disponible, cependant l'adresse mémoire n'est réellement plus "valide" que lorsqu'un autre objet réalloue cet emplacement mémoire, enfin c'est ce que je constatais sur windows NT et Windows XP.


    Assigned autrement c'est la méthode qui est utilisé dans la plupart des objets borland pour tester l'existence de l'instance d'un objet, pourquoi ne pas suivre
    leur exemple, même si aujourd'hui dans le principe c'est la même chose. Sicette méthode a été créé, ce n'est probablement pas pour rien.

    Sauf que Free est là justement pour pouvoir être invoqué sans dommage sur un pointeur nul; le test ne sert donc à rien.
    Je ne vois pas, quel test est inutile, FreeAndNil est une méthode.

  11. #11
    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
    J'ai essayé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    constructor TFichier.Create;
    begin
       ListeGroupe := TObjectList.Create;
       ListeGroupe.OwnsObjects := true;
    end;
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    constructor TGroupe.Create;
    begin
       ListeFace := TObjectList.Create;
       ListeFace.OwnsObjects := true;
       ListePoint := TObjectList.Create;
       ListePoint.OwnsObjects := true;
       ListeCouleur := TObjectList.Create;
       ListeCouleur.OwnsObjects := true;
    end;
    pour les créations
    et enfin
    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;
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    destructor TGroupe.Destroy;
    begin
       self.ListePoint.Free;
       self.ListeCouleur.Free;
       self.ListeFace.Free;
       inherited Destroy;
    end;
    et j'ai toujours le même message
    Opération de pointeur incorect!!!

  12. #12
    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
    Citation Envoyé par macumba Voir le message
    la méthode qui est utilisé dans la plupart des objets borland pour tester l'existence de l'instance d'un objet, pourquoi ne pas suivre leur exemple, même si aujourd'hui dans le principe c'est la même chose. Sicette méthode a été créé, ce n'est probablement pas pour rien.
    Je crois que macumba, tu ne connais pas Paul TOTH, n'essaye pas de lui apprendre ce qu'il sait mieux que toi

    A quel moment, tu voudrais utiliser FreeAndNil ?
    Normalement, tu ne passe pas plusieurs fois dans le destructeur, il est vrai qu'avec des objets présents dans plusieurs listes, ça peut être délicat, pour cela, il faut prévoir un système de notification !
    La Solution du FreeAndNil fonctionne mais c'est une rustine d'appel successif à un destructeur, ce qui est mal !

    Mais dans le cas actuel, cela ne semble pas être le cas (quoi que ???)

    Sinon, Assigned, selon les version de Delphi, on a le code, mais c'est surtout conçu pour les pointeurs de procédure, sur les objets, test à nil c'est pareil !

    @Lio908
    Pourquoi tu continues à utiliser "Groupe.Destroy" alors que l'on a dit qu'il fallait utiliser "Groupe.Free", en plus que cela ne sert à rien !

    Pourquoi tu continues à libérer tes objets manuellement par "Groupe.Destroy \ Free", alors que tu as affecté OwnsObjects à true ? As-tu compris à quoi servait OwnsObjects ?
    En regardant ton destructeur de TFichier, on voit que tu n'as pas compris !

    Tu avais pensé au Delete, effectivement, une fois libéré, autant le supprimer, dans le dernier code, il n'y a pas de Delete, là c'est double libération garantie (une manuelle par boucle, une auto par OwnsObjects)

    Tu pourrais ajouter des traces (Journal d'Evènements : CTRL + ALT + V) comme cela, peut-être que tu pourrais affiner l'endroit de l'exception

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    destructor TGroupe.Destroy;
    begin
       OutputDebugString('self.ListePoint.Free');
       self.ListePoint.Free;
       OutputDebugString('self.ListeCouleur.Free');
       self.ListeCouleur.Free;
       OutputDebugString('self.ListeFace.Free');
       self.ListeFace.Free;
       OutputDebugString('inherited');
       inherited Destroy;
    end;
    TFichier et TGroupe hérite de TObjet, tu peux omettre le Create, moi par habitude, je le mets, on ne sait jamais si l'on change l'ancêtre durant le dev
    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

  13. #13
    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
    Ok
    Dans mon raisonnement,
    si je met groupe.free, je rentre pas dans le destructeur de groupe qui me permet de faire les listes.free

    Mais maintenant si vous me dites que de faire groupe.free implique SI j'ai mis OwnsObjects à true, la destruction des objects des listes + l'object groupe alors OK, tout est détruit et libéré.

    Omettre le create, OK mais je défini mes listes ou?

  14. #14
    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
    OwnsObjects est initialisée à true par défaut ! - c'est l'une des 1ère choses écrites dans l'aide de la TObjectList
    Tu n'as pas besoin de le forcer ! d'où tes erreurs de double libération !
    Toujours lire l'aide avant d'utiliser un nouvel objet, cela aurait permis d'éviter une grosse perte de temps


    Tu ne rentre pas ??? tu as mis override ?

    Je ne parlais pas de la surcharge de Create mais de son inherited !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    constructor TFichier.Create;
    begin
      inherited Create(); // ça !!!
     
      ListeGroupe := TObjectList.Create; // OwnsObjects = True par défaut
    end;
    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

  15. #15
    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
    Ok
    pour résumer, si j'écris direct fichier.free,

    1 ça libère mon object fichier
    2 donc la liste des groupes du fichier
    3 donc les objects groupe contenus dans cette liste
    4 donc par groupe, les 3 listes
    5 donc les objects contenus dans ces listes

    tout en fait!

    pas besoin de boucles...

  16. #16
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par lio908 Voir le message
    pas besoin de boucles...
    Non pas besoin. C'est l'intérêt d'un TObjectList (avec un OwnsObjects à True, qui est la valeur par défaut à l'appel du constructeur).
    De fait, la liste devient propriétaire des objets qu'elle contient, et se chargera donc de libérer ces objets lors de sa destruction.

    Conclusion: Un appel à Free, c'est tout.

    @+

  17. #17
    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
    C'est ce que j'ai fait et plus de defaut

    ...par contre, j'ai chargé une dizaine de fichier et les aie détruit par cette méthode mais ma quantité de mémoire n'est pas restitué entièrement!

  18. #18
    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 448
    Points
    28 448
    Par défaut
    Citation Envoyé par lio908 Voir le message
    Ok
    pour résumer, si j'écris direct fichier.free,

    1 ça libère mon object fichier
    oui c'est fait pour ça
    Citation Envoyé par lio908 Voir le message
    2 donc la liste des groupes du fichier
    uniquement si le destructeur surchargé de Fichier fait appel à Groupe.Free ListeGroupe.Free car Fichier un est TObject qui ne libère pas ses membres
    Citation Envoyé par lio908 Voir le message
    3 donc les objects groupe contenus dans cette liste
    Groupe ListeGroupe étant un TObjectList il détruit les objets qu'il contient quand il est détruit : c'est à ça que cela sert !
    Citation Envoyé par lio908 Voir le message
    4 donc par groupe, les 3 listes
    même remarque que pour Fichier
    Citation Envoyé par lio908 Voir le message
    5 donc les objects contenus dans ces listes

    tout en fait!

    pas besoin de boucles...
    EDIT: confusion entre Groupe et ListeGroupe
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  19. #19
    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 448
    Points
    28 448
    Par défaut
    Citation Envoyé par macumba Voir le message
    Free libère le pointeur et rend l'emplacement mémoire disponible, cependant l'adresse mémoire n'est réellement plus "valide" que lorsqu'un autre objet réalloue cet emplacement mémoire, enfin c'est ce que je constatais sur windows NT et Windows XP.
    un destructeur n'efface pas la mémoire occupée par l'objet, elle se contente de la déclarée disponible pour de futures allocation...ce n'est pas pour cela qu'il est "valide" d'utiliser un objet détruit dont l'emplacement mémoire n'est peut-être pas réutilisé.

    Citation Envoyé par macumba Voir le message
    Assigned autrement c'est la méthode qui est utilisé dans la plupart des objets borland pour tester l'existence de l'instance d'un objet, pourquoi ne pas suivre
    leur exemple, même si aujourd'hui dans le principe c'est la même chose. Sicette méthode a été créé, ce n'est probablement pas pour rien.
    c'est donc un acte de foi, je ne peux rien contre cela.

    Citation Envoyé par macumba Voir le message
    Je ne vois pas, quel test est inutile, FreeAndNil est une méthode.
    le test dont tu parles dans "Il vaut mieux éviter de tester le nil et utiliser la méthode Assigned pour tester l'existence d'un objet"
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  20. #20
    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
    Bonjour

    uniquement si le destructeur surchargé de Fichier fait appel à Groupe.Free car Fichier un est TObject qui ne libère pas ses membres
    groupe.free ou listegroupe.free?
    Fichier peut avoir n groupe(s)

    Si c'est groupe.free, il me faut les passer en revu dans une boucle dans le destructeur de fichier?

    petit rappel pour tout le monde de mon pb:
    Fichier a des objects groupe dans 1 liste
    Groupe a des objects Point,Couleur,Face dans 3 listes

    Question: méthode pour vider/libérer le tout:
    solution 1, dans le destructeur de fichier, metre self.listGroupe.free
    avec dans le destructeur de groupe,
    self.listePoint.free;
    self.listeCouleur.free;
    self.listeFace.free;
    mais dans ce cas il me semble que j'ai mon niveau de mémoire qui baisse.
    J'ai chargé 10 fichiers et les ait appelé 3 fois, la mémoire passe de 27% à 40%
    (Si je ferme l'appli je retombe à 27%)

    solution 2 dans le destructeur de fichier,
    je boucle sur ma liste des groupes et détruit le groupe par groupe.free
    et dans le destructeur de groupe,
    je boucle sur mes liste du groupe et détruit les objects par object.free
    methode apparement inutils puisque de base, TObjectList libère tout le monde sur un free.

    Donc si j'ai bien compris c'est Solution 1 mais pour l'instant avec perte de mémoire

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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