TObjectList , Remove

Résolu
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 - 28 janv. 2009 à 13:41
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 - 3 févr. 2009 à 09:07
Bonjour ,
J'ai un gros problème de libération de mémoire et je ne vois pas ou est mon erreur ...

J'ai une structure de ce type :

type
  TMyObject  = class
 private
 public
 constructor Create ;
 destructor Destroy ;
end;

  TMyList = class(TObjectList)
  protected
    function Get( Index : Integer ) : TMyObject;
    procedure Put( Index : Integer; Item : TMyObject);
  public
    property Items[ Index : Integer ] : TMyObject read Get  write Put; default;
    constructor Create;
  end;

 TAutreObject = class
 private
 MyList : TMyList;
// blabalbla
public
 construtor Create ;
 procedure RemoveAll;
...

implementation
{ - TMyObject ---------------------------------------------------------- }
constructor TMyObject .Create
begin
 inherited Create;
end;

destructor TMyObject .Destroy
begin
 // je supprime bien sur ts ce que j'ai pu creer ici, mais pr l'exemple, ca n'en vaut pas la peine ...
 inherited Destroy;
end;

 
{ - TMyList ---------------------------------------------------------- }
constructor TMyList .Create;
begin
  inherited Create(True);// OwnObject est a True, Donc libération des Objects Automatique !
end;

function TMyList .Get( Index : Integer ) : TMyObject;
begin
  Result := inherited Get( Index );
end;

procedure TMyList .Put( Index : Integer; Item : TMyObject);
begin
  inherited Put( Index, Item );
end;

{ - TAutreObject ---------------------------------------------------------- }
construtor TAutreObject .Create ;
begin
 inherited Create;
MyList  := TMyList.Create;
// blablabla
end;

procedure TAutreObject .RemoveAll;
var
 i : integer;
begin
 for i:=0 to MyList.Count-1 do begin
   //Supprime un objet spécifié de la liste
  
// et (si OwnsObjects est à true) libère l'objet.
   MyList.Rmove(MyList.Items[i]);
 end;

 MyList.Capacity := MyList.Count;
// Mais il ne supprime rien ! Enfin si , mon vecteur est vide
//mais ma mémoire est toujours autant occupée , prq ?!!
end;

Voila ben ma question est simple , Pourquoi ca ne me libère rien coté mémoire ?!

Merci

31 réponses

Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
29 janv. 2009 à 16:09
... Si je t'ai bien suivi, quand une application risque trop de fragmenter la ram, on a intérêt à s'orienter vers les tableaux plutôt que les listes...
Et peut-être même aussi vers TFileStream s'il y a vraiment énormément d'objets? 
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
29 janv. 2009 à 16:35
Ouaich.

Cela dit les tas sont plutôt bien codés en général, donc ça se passe plutôt bien.

Genre ton appli alloue pour 1 Go d'objets -> Consommation mémoire 1 Go.
Ton appli libère pour 500 Mo d'objets -> Fragmentation -> Consommation à 750 Mo.
Ton appli alloue pour 500 Mo d'objets -> Remplissage des trous -> Consommation mémoire 1 Go.

Bref, c'est pas si affolant que ça la mémoire qui redescend pas. C'est dommage, mais ça n'aura pas tant d'influence que ça sur les pics, qui sont surtout ce que ressent l'utilisateur.

[troll]
De toute façon avec le Delphi, même sans trop faire gaffe, on fait toujours mieux que ce que l'on ferait avec un autre langage moderne.
/troll
0
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
29 janv. 2009 à 16:40
"- Imaginons une application qui doit créer de très
nombreux objets et les libérer presque aussitôt. Si on n'a pas bcp de
chance, ne risque t-on pas d'arriver à un plantage du système, même si
le code est irréprochable du côté des libérations "

C'est bien ce qui m'arrive avec mon appli, et ça me fait *** !

Je travaille avec des bitmaps, donc tu imagines facilement a quelle vitesse la ram peut être saturé !
0
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
29 janv. 2009 à 16:41
oups , pas vu de 3ème page !
0

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

Posez votre question
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
29 janv. 2009 à 17:05
Tu as essayé FastMM ?



Il est présenté comme plus performant (Jamais vérifié, cela dit elle a pas été codée par des comiques), et permet de détecter les fuites.
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
29 janv. 2009 à 17:43
@Nico

Peut-être pourrais-tu t'inspirer de la technique de GRANDVIZIR?

Je le cite :
« ... en effet, ~.Free avec les BMP est très ennuyeux car Create et Free répétés finissent par submerger le swap et à faire ramer l'application terriblement. J'ai tjs rusé: je partage les ressources au lieu de les créer et les détruire. Ainsi, dans un composant, si j'ai besoin d'un bitmap, je crée un TBitmap une fois pour toute et qui subit toutes les tortures inimaginables et rend l'âme après clic sur la croix. »
0
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
29 janv. 2009 à 17:59
Oui, c'est sur que ce n'est pas con comme technique ;)
Excusez pour le tps de réponse mais on a éclaté le quota d'internet ->Adsl Lent :(
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
2 févr. 2009 à 18:17
Héhéhé

Mais t'es padonné, absous, relaxé, gracié et même remercié car j'ai appris plein de trucs intéressants. 
0
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
2 févr. 2009 à 18:32
moi aussi , d'ailleurs je ferais des fautes plus souvent
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
3 févr. 2009 à 00:23
J'arrive après la bataille. Néanmoins, les explications données par rt15 justifient la trentaine de posts pour une question qui aurait dû être résolue en 3 réponses maximum.
@nicolas___ : tu dis "moi aussi , d'ailleurs je ferais des fautes plus souvent". Vas-y mollo tout de même et, comme le reste, consomme avec modération (comme disent les modérateurs ).

May Delphi be with you !
<hr color="#008000" />Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
3 févr. 2009 à 09:07
Désolé DelphiProg ,
je poste encore mais c'est pour dire que je ferai des efforts ...
(heureusement , j'abuse quand même rarement du forum )

Mais c'est vrai que ces temps ci, le forum de DelphiFR m'a été d'une grande aide !

Merci

Nico
0
Rejoignez-nous