Destruction d'objet d'une TList

Résolu/Fermé
furax13 Messages postés 90 Date d'inscription mardi 28 octobre 2003 Statut Membre Dernière intervention 24 avril 2008 - 9 août 2006 à 09:22
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 - 10 août 2006 à 14:20
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

cs_neko Messages postés 135 Date d'inscription jeudi 14 août 2003 Statut Membre Dernière intervention 12 octobre 2006 1
9 août 2006 à 09:36
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
3
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
10 août 2006 à 10:09
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,
3
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
9 août 2006 à 11:52
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
0
jinh68 Messages postés 215 Date d'inscription mardi 29 juillet 2003 Statut Membre Dernière intervention 1 septembre 2006
10 août 2006 à 10:00
Ê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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jinh68 Messages postés 215 Date d'inscription mardi 29 juillet 2003 Statut Membre Dernière intervention 1 septembre 2006
10 août 2006 à 11:01
Ok merci, rien ne vaut la vérification dans le code effectivement ;).

j!nH
0
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
10 août 2006 à 14:20
t'as les sources, profite en ! ;-)
0
Rejoignez-nous