Destruction d'objet d'une TList [Résolu/Fermé]

Messages postés
90
Date d'inscription
mardi 28 octobre 2003
Dernière intervention
24 avril 2008
- - Dernière réponse : cs_Loda
Messages postés
900
Date d'inscription
vendredi 3 novembre 2000
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
Afficher la suite 

6 réponses

Meilleure réponse
Messages postés
135
Date d'inscription
jeudi 14 août 2003
Dernière intervention
12 octobre 2006
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 119 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_neko
Messages postés
900
Date d'inscription
vendredi 3 novembre 2000
Dernière intervention
30 juillet 2009
3
3
Merci
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,

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 119 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Loda
Messages postés
900
Date d'inscription
vendredi 3 novembre 2000
Dernière intervention
30 juillet 2009
3
0
Merci
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
Commenter la réponse de cs_Loda
Messages postés
215
Date d'inscription
mardi 29 juillet 2003
Dernière intervention
1 septembre 2006
0
Merci
Ê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
Commenter la réponse de jinh68
Messages postés
215
Date d'inscription
mardi 29 juillet 2003
Dernière intervention
1 septembre 2006
0
Merci
Ok merci, rien ne vaut la vérification dans le code effectivement ;).

j!nH
Commenter la réponse de jinh68
Messages postés
900
Date d'inscription
vendredi 3 novembre 2000
Dernière intervention
30 juillet 2009
3
0
Merci
t'as les sources, profite en ! ;-)
Commenter la réponse de cs_Loda

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.