begin process at 2012 02 09 07:33:20
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Delphi

 > 

Divers

 > 

Aide et documentation

 > 

TObjectList , Remove


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

TObjectList , Remove

mercredi 28 janvier 2009 à 13:41:37 | TObjectList , Remove

Nicolas___

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

mercredi 28 janvier 2009 à 13:45:42 | Re : TObjectList , Remove

Nicolas___

Bien sur pour ajouter qqch à ma liste je fais comme ceci :

procedure  TAutreObject.AddObject ( Item : TMyObject ) ;
begin
 MyList.Add ( Item );
end;



mercredi 28 janvier 2009 à 14:27:04 | Re : TObjectList , Remove

WhiteHippo

Membre Club
Bonjour

Une petite question : Pourquoi tu n'emploies pas tout simplement MyList.Clear pour supprimer les éléments ?

Cordialement.

"L'imagination est plus importante que le savoir." Albert Einstein
mercredi 28 janvier 2009 à 14:36:48 | Re : TObjectList , Remove

Nicolas___

Parce que ici je ne montre pas ts le code
(il est un peu long) ,
et que je ne dois pas effacer toute la liste , juste un certain nombre objet de la liste avec un Tag spécial ...
(Dans mon RemoveAll j'ai une condition , et si elle est a true -> Remove )

J'ai l'instruction  TAutreObject.Clear qui appele tous simplement MyList.Clear , mais la encore , ce n'est aps libéré !

(J'ouvre le gestionnaire de tâches en même tps, je créé +- 500 object , ma mémoire occupée grimpe et quand je fais un Clear ou un RemoveAll, pas de différences , mais pourtant mon vecteur est vide ... )



mercredi 28 janvier 2009 à 14:45:27 | Re : TObjectList , Remove

WhiteHippo

Membre Club
Et avec un petit coup de MyList.Pack ?

N.B. Attention les objets contenus doivent avoir été assigné à NIL après leur suppression.

Cordialement.

"L'imagination est plus importante que le savoir." Albert Einstein
mercredi 28 janvier 2009 à 15:08:09 | Re : TObjectList , Remove

Nicolas___

Pack
Supprime tous les éléments nil (Delphi) ou NULL (C++) du tableau Items.

Description

La méthode Pack déplace tous les éléments non-nil (Delphi) ou non-NULL (C++) au début du tableau Items, puis réduit la propriété Count au nombre d'éléments réellement utilisés. Pack ne libère pas la mémoire utilisée pour stocker les pointeurs nil (Delphi) ou NULL (C++). Pour libérer la mémoire allouée aux entrées inutilisées qui sont supprimées par Pack, affectez la nouvelle valeur de Count à la propriété Capacity.

Donc j'ai fais ca :

procedure TAutreObject .RemoveAll;
var
 i : integer;
begin
 for i:=0 to MyList.Count-1 do begin
 MyList.Items[i] := nil;
 end;
 MyList.Pack;
 MyList.Capacity := MyList.Count;
end;

Ca ne change rien !

Et quand je veux faire

procedure TAutreObject .RemoveAll;
var
 i : integer;
begin
 for i:=0 to MyList.Count-1 do begin
 MyList.Items[i] .free;// Forcement ca plante royalement !
 end;
 MyList.Capacity := MyList.Count;
end;

mercredi 28 janvier 2009 à 15:32:16 | Re : TObjectList , Remove

WhiteHippo

Membre Club
Moi j'aurais plutôt écrit quelquechose comme :

procedure TAutreObject .RemoveAll;
var
 i : integer;
begin
  for i:=0 to MyList.Count-1 do 
  begin
    MyList.Remove(MyList.Items[i]); 
    MyList.Items[i] := nil; // Assignation à nil après la libération.

  end;
  MyList.Pack;
  MyList.Capacity := MyList.Count;
end;

N.B. Désolé, j'ai pas de quoi testé pour l'instant, alors c'est tout en live !!!

Cordialement.

"L'imagination est plus importante que le savoir." Albert Einstein
mercredi 28 janvier 2009 à 15:53:50 | Re : TObjectList , Remove

Nicolas___

MyList.Remove(MyList.Items[i]);
MyList.Items[i] := nil; // Assignation à nil après la libération.

Je pense pas que ça marche , enfin ça plante même

Aide : "Après qu'un objet a été supprimé, tous les objets qui suivent sont déplacés et Count est décrémenté"

Donc dans ton code , le
MyList.Items[i]:=nil , l'indice "i" ne fait plus référence au même object , Si ?


Merci de ton aide

mercredi 28 janvier 2009 à 16:41:50 | Re : TObjectList , Remove

WhiteHippo

Membre Club
Je ferais des tests ce soir, ça m'évitera peut etre de t'aiguiller vers des fausses pistes et/ou de dire ces betises.

Cordialement.

"L'imagination est plus importante que le savoir." Albert Einstein
mercredi 28 janvier 2009 à 17:25:26 | Re : TObjectList , Remove

Bacterius

Membre Club

Salut Nicolas.

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.Remove(MyList.Items[i]);
   asm DEC I end;
  end;

Faut utiliser l'asm sinon Delphi va grogner. Chez moi, 50000 éléments, application passe à 8000Ko mémoire, après RemoveAll, retombe à 4000.
La raisonest que quand tu supprime un objet, Count est automatiquement décrémenté : donc, tu te retrouves avec une belle V.A, et aucune libération.

Cordialement, Bacterius !


1 2 3 4

Cette discussion est classée dans : end, index, create, tmyobject, tmylist


Répondre à ce message

Sujets en rapport avec ce message

Besoin d'un expert Delphi pour résoudre un souci de traitement de sous-propriété d'un composant. [ par Rycku ] Bonjour,Je vais essayer d'être le plus clair possible, voilà quatre semaines que je suis bloqué sur un probléme malgré toutes mes recherches sur diver raise Exception.Create : gérer les exceptions ? [ par manudel ] Voilà je ne sais pas comment "catcher" une exception.L'exception se déclenche, et à mon avis remonte au niveau le plus haut, en cherchant un gestionna AddIndex [ par titi3847 ] TitiBonjour,J'ai créé une table DBF et je voudrais mettre des index secondaires. J'ai réussi à créer des index secondaire avec un seul champs. Si je v Problème création thread [ par VolaiL ] Bonjour, j'ai un petit problème de création de thread.Je souhaiterai lancer le thread lorsqu'on appuie sur enter, mais ca bloque dès la crétion sur "i Composants Dynamiques et Array [ par picolo5 ] Bonsoir à tous !!j'ai un piti souci avec des composants dynamiques (TCustomPanel + autres composants) que je stockent dans un tableau.Le probleme se s Creation d'un composant graphique [ par Sat83 ] Bonjour!Je me suis lancée dans la création de mon premier composant graphique, mais j'ai un petit probleme.En gros, je veut creer un composant de type résolution sudoku backtrack [ par zwyx ] Bonjour à tous, Pour ceux qui aiment bien se creuser la tête sur de l'algorithmie... J'ai écrit un code permettant de résoude une grille de sudoku ré Dbgrid et index [ par zerargui ] j'ai pris un petit programme de Delphiprog en le modifiant par la lecture des indexes de DBase .DBF par indexex de base Paradox  .db tous s'affiche no Tri milti criter [ par louiwahl ] Bjr. je suis toujour en train de faire un logiciel de recherche de recette. j'arrive a trier ma base avec une valeur a la fois mais je voudrais que l Refresh trop lent dans un composant [ par Francky23012301 ] Salut la compagnieJ'ai réalisé un petit composant  : Celui fonctionne très bien sauf qu'il est terriblement lent ce qui fait que le refresh de la fich


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,137 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales