Destruction d'objet d'une TList

[Résolu/Fermé]
Signaler
Messages postés
90
Date d'inscription
mardi 28 octobre 2003
Statut
Membre
Dernière intervention
24 avril 2008
-
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
-
bonjour,
j'ai créé la classe suivante :

TYPE
  TContrainteListe = TList;
  TCoilListe = TList;


  TCOOptimisation = CLASS(TObject)
  PRIVATE
   ...
    FListeContrainte: TListeContrainte;
    TAutomate: TCOAutomate;
    TCycleThermique: TCOCycleThermique;
...
DESTRUCTOR Destroy; OVERRIDE;
  FUNCTION getContrainteDepuisListe(CONST position: integer): TCOContrainte;
 
  ...
  end;

Dans le destructeur, j'ai codé ceci :

DESTRUCTOR TCOOptimisation.destroy;
var
  I : integer;


BEGIN
  IF traceOptim = true THEN
    LogOptim.addStr('Destruction classe OPT_Optimisation');


  for i:= 0 to FNbContraintes-1 do
  with getContrainteDepuisListe(I) do
  begin
  free;
  end;


  IF assigned(FListeContrainte) THEN
    FListeContrainte.free;
  TAutomate.free;
  TCycleThermique.free;
  INHERITED destroy;
END;

La liste FListeContrainte est de type TList mais contient des objets de type TCOContrainte.

J'aimerais détruire ma liste mais également détruire les objets contenus dans ma liste.

Comment faire ceci le plus proprement?

merci

6 réponses

Messages postés
135
Date d'inscription
jeudi 14 août 2003
Statut
Membre
Dernière intervention
12 octobre 2006
1
for i:=FListeContrainte.Count-1 DownTo 0 Do

TCOContrainte(FListeContrainte.Items[i]).Free;

TOn FNbCOntrainte est inutil ( il y a le count de FListeContrainte pour connaitre le nombre d'éléments dans la liste ) Enfin je suppose que c'est la même chose en regardant ton code

for i:= 0 to FNbContraintes-1 do

with getContrainteDepuisListe(I) do

begin

free;

end;

Ca c'est très laid, le With ne sert a rien et il alourdi le code. Tu peux faire :

for i:= 0 to FNbContraintes-1 do

getContrainteDepuisListe(I).Free

Directement ( ou encore mieu, le code plus haut ).

IF assigned(FListeContrainte) THEN
FListeContrainte.free;

La méthode Free verrifie déjà si l'objet est a nil ou pas, la condition ne sert a rien ici :)


heu voilà, si j'ai bien lu je crois avoir répondu a ta question


bouh
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
salut,
absolument certain:

procedure TObject.Free;
begin
if Self <> nil then
Destroy;
end;

mais, tu as raison "pour s'assurer que le pointeur ne pointe plus vers l'ancien espace mémoire" FreeAndNil est mieux.

Cependant, cela pose des fois des problèmes. EN effet, FreeAndNil devrait s'appeler NilAndFree:
procedure FreeAndNil(var Obj);
var
Temp: TObject;
begin
Temp := TObject(Obj);
Pointer(Obj) := nil;
Temp.Free;
end;

ce peut poser des problèmes pour certaines classes. Tu te retrouve avec des AV lors des destroy.

bon code,
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
salut,

perso, je te recommande TObjectList:


Use TObjectList to store and maintain a list of objects. TObjectList provides properties and methods to add, delete, rearrange, locate, access, and sort objects. If the OwnsObjects property is set to true (the default), TObjectList controls the memory of its objects, freeing an object when its index is reassigned; when it is removed from the list with the Delete, Remove, or Clear method; or when the TObjectList instance is itself destroyed.

donc tu peux remplacer ton code par:

FListeContrainte.free;


c'est beau non?

bon code
Messages postés
215
Date d'inscription
mardi 29 juillet 2003
Statut
Membre
Dernière intervention
1 septembre 2006

Êtes vous sûr que Free vérifie si le pointeur est déréférencé ?

Personnellement, je conseille plutôt de faire systématiquement:

if Assigned(Var) then FreeAndNil(Var);

pour s'assurer que le pointeur ne pointe plus vers l'ancien espace mémoire.

j!nH
Messages postés
215
Date d'inscription
mardi 29 juillet 2003
Statut
Membre
Dernière intervention
1 septembre 2006

Ok merci, rien ne vaut la vérification dans le code effectivement ;).

j!nH
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
t'as les sources, profite en ! ;-)