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

furax13 90 Messages postés mardi 28 octobre 2003Date d'inscription 24 avril 2008 Dernière intervention - 9 août 2006 à 09:22 - Dernière réponse : cs_Loda 900 Messages postés vendredi 3 novembre 2000Date d'inscription 30 juillet 2009 Dernière intervention
- 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
cs_neko 135 Messages postés jeudi 14 août 2003Date d'inscription 12 octobre 2006 Dernière intervention - 9 août 2006 à 09:36
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

Merci cs_neko 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 68 internautes ce mois-ci

Commenter la réponse de cs_neko
Meilleure réponse
cs_Loda 900 Messages postés vendredi 3 novembre 2000Date d'inscription 30 juillet 2009 Dernière intervention - 10 août 2006 à 10:09
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,

Merci cs_Loda 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 68 internautes ce mois-ci

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

j!nH
Commenter la réponse de jinh68
cs_Loda 900 Messages postés vendredi 3 novembre 2000Date d'inscription 30 juillet 2009 Dernière intervention - 10 août 2006 à 14:20
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.