Deinitialisierung von TList
-
Hi,
in meinem Projekt verwende ich mehrere TLists. Doch beim Beenden des Programms meldet der CodeGuard (Resourceleak). Ich nehme an, dass es nur die TLists sein können, da ansonsten nur "einfache" Variablen dabei sind.
Also wie stelle ich das richtig an? (delete <TList> funktioniert nicht).Maffe
-
guckst du hier:
TList tl = new TList();
.
.
.
tl.Clear();Clear löscht alle Elemente aus der Liste.
virtual void __fastcall Clear(void);
Beschreibung
Mit Clear wird das Array Items geleert, und Count sowie Capacity werden auf 0 gesetzt. Außerdem wird der gesamte vom Array belegte Speicher freigegeben.
-
Also bei mir (BCB6 Enterprise, W2K) zeigt der CodeGuard genau an, an welcher Stelle
der Speicherleck auftritt. Und auf einen Doppelklick hin springt er sogar genau an
diese Stelle. Darüber hinaus kann ich nicht nachvollziehen, warum delete für TList
nicht funktionieren sollte. Ich hatte damit noch keine Probleme.Gruß,
Alexander
-
Guckst Du auf meiner Seite unter "BCB->dynamische Arrays", ganz unten.
-
@smitty:
Danke erstmal, ich werd's ausprobieren. Hat jetzt auf den ersten Versuch noch nicht geklappt, aber vielleicht liegt's auch an was anderem.@alexander:
Bei mir gibt GodeGuard nur anThe object 0x.... [Size...] was created with new.
Darunter ist dann noch ein Baum mit den Funktionen, die das Object durchlaufen hat. Wenn ich doppelklicke, dann klappt nur ein Fenster mit nem CPU-Ausschnitt auf, welcher, zu mindest für mich, nicht wirklich hilfreich ist.
-
@alexander:
Ok, ich ziehe alle Einwände zurück. Ich hab gerade rausgefunden, dass man sich durch den Baum "hangeln" kann.@smitty
Dadurch, dass ich jetzt weiss, wie man mit dem Protokoll umgeht, weiss ich auch, dass ich Clear an der richtigen Stelle angewendet habe. Beim Debuggen hab ich auch gesehen, dass alles auf NULL gesetzt wird.Warum kommt dann immernoch diese Meldung?
-
Maffe001 schrieb:
Warum kommt dann immernoch diese Meldung?
Smitty schrieb:
guckst du hier:
TList tl = new TList();
.
.
.
tl.Clear();Trotzdem mußt Du noch das mit new erstellte Objekt - also tl - per delete freigeben.
Clear gibt nur das von TList verwaltete Array Items frei. (Oder ich habe hier etwas
völlig falsch verstanden?)Gruß,
Alexander
-
@ alexander,
klar noch mit delete löschen, denn das tlist objekt ist noch da. zwar genullt, aber noch da.
aber dass es dann noch probleme verursacht
-
Tja, jetzt verstehe ich gar nichts mehr. Ich lösche jetzt schon jedes Element einzeln aus TList und trotzdem kommt immernoch diese Meldung. Für den besseren Überblick schreib ich mal drunter, wie ich's fülle und lösche.
//Das Füllen der Liste TDBListElem *DB = NULL; //TDBListElem ist ein struct TList *DBList = NULL; . . . for (int zaehler = 0;....) { DB = new TDBListElem; DB->../*mit Werten füllen*/; if (DBList == NULL) DBList = new TList; DBList->Add(DB); }
//Das Löschen TDBListElem *DB = NULL; for (int zaehler = 0; zaehler < DBList->Count; zaehler++) { DB = (TDBListElem *) DBList->Items[zaehler]; delete DB; } DBList->Clear(); delete DBList;
Jemand Ideen?
-
Versuch's doch mal mit einer while-Schleife, sonst werden nicht alle Elemente
der Liste gelöscht.//Das Löschen TDBListElem *DB = NULL; while (DBList->Count > 0) { DB = (TDBListElem *) DBList->Items[0]; DBList->Delete(0); delete DB; } DBList->Clear(); // Kann man sich dann eigentlich sparen delete DBList;
Gruß,
Alexander
[edit]Reihenfolge von DBList->Delete(0) und delete DB vertauscht.[/edit]
-
Also wenn ich das richtig sehe, dann ist das das Gleiche was ich auch mache nur kompakter und schöner. Aber gut ich versuch's.
-
Nein, wieder kein Erfolg. Also so langsam regt mich das Ganze ein bisschen auf.
-
Welches Objekt wird denn von CodeGuard angemeckert? Das TList-Objekt oder ein
anderes?
-
Maffe001:
Bevor du noch einen Herzinfarkt bekommst hol lieber eine zweite Meinung ein, d.h. lass deine Code mal von einem alternativen Tool wie z.B. MemProof begutachten.
CodeGuard ist schliesslich auch nur ein Mensch ...
-
@Alexander:
TDBListElem wird angemeckert.@Jansen:
Meinst du das hilft? Das Ding ist, dass CodeGuard bei allen TLists meckert, die ich zur Laufzeit erstelle und als Klassenbestandteile bis Programmende aufrecht erhalte.
Aber gut, Versuch macht kluch.
-
@Jansen:
So wie ich das hier sehe, ist MemProof nur bis BCB 5 einsetzbar. Ich schreib leider auf BCB 6.
-
Smitty schrieb:
guckst du hier:
TList tl = new TList();
.
.
.
tl.Clear();Clear löscht alle Elemente aus der Liste.
virtual void __fastcall Clear(void);
Beschreibung
Mit Clear wird das Array Items geleert, und Count sowie Capacity werden auf 0 gesetzt. Außerdem wird der gesamte vom Array belegte Speicher freigegeben.
der Satz Außerdem wird der gesamte vom Array belegte Speicher freigegeben. bezieht sich auf das Array. Nicht auf den Inhalt des Arrays.
du wirst vor Clear() die Liste durchgehen müssen :
for(int i=List->Count-1;i<0;--i) { delete (ItemType) List->Items[i]; }
-
@AndreasW:
Wenn du mal ein paar Beiträge weiter vorn schaust, dann siehst du, dass ich das schon gemacht habe.Trotzdem bleibt die Meldung die Gleiche.
-
Auf die Gefahr hin, dass ich mich wiederhole:
Siehe auf meiner Seite unter "BCB->dynamische Arrays", ganz unten.
-
@F98:
Ist ja schön und gut. Aber ich muss ehrlich sein. Wirklich verstehen tu ich das nicht. Ich hab mich noch nicht mit Templates auseinandergesetzt.
Gibt es da nicht noch einen "einfacheren" Weg?