Speicher wird nicht freigegeben?

Hallo!
(Umgebung: VC6.0, Windows2000)
Bei einem Zeiger eines CObArray wird der Speicher nach dem löschen nicht freigegeben. Ein Beispiel:

CObArray * oArray = new CObArray;

for (int iPos=0; iPosAdd(dummy);
}

delete oArray;
oArray = NULL;

Laut Lehrbuch müsste hier doch das Programm den Speicherraum von dem ObjektArray wieder freigeben. Das macht er aber nicht!
Was mache ich da falsch???

Danke für jede Antwort im Vorraus!

Ciao
Catmad

Hallo!

Hallo :smile:

CObArray * oArray = new CObArray;

for (int iPos=0; iPosAdd(dummy);
}

delete oArray;
oArray = NULL;

Kann es sein, daß du eine halbe Millionen Objekte mit new erzeugst, aber nur eins wieder freigebgt?

HTH,
Jo

Bei einem Zeiger eines CObArray wird der Speicher nach dem
löschen nicht freigegeben. Ein Beispiel:

Du gehst davon aus, dass das CObArray im Destruktor alle Elemente die es enthält löscht, das tut es aber vermutlich nicht. D. h. du mußt die Elemente selber löschen, und dann erst das CObArray.

Grüße, Robert

Hallo Johannes!

Kann es sein, daß du eine halbe Millionen Objekte mit new
erzeugst, aber nur eins wieder freigebgt?

Mmhh, ich lösche doch einen Array und nicht eine Position innerhalb des Array.
Hab auch jenes versucht bevor ich das ObArray löschte:

oArray->RemoveAll();
oArray->FreeExtra();

//und dann
delete oArray;
oArray = NULL;

Hat trotzdem nicht funktioniert!

Hallo Robert!

Du gehst davon aus, dass das CObArray im Destruktor alle
Elemente die es enthält löscht, das tut es aber vermutlich
nicht. D. h. du mußt die Elemente selber löschen, und dann
erst das CObArray.

Habe ich ebenfalls versucht. Beim Beenden des Programs wird diese Funktion ausgeführt:

try
{
int iSize = oArray->GetSize();
for (int iPos=0; iPosGetAt(iPos);
delete Daten;
Daten = NULL;
oArray->RemoveAt(iPos);
}

oArray->RemoveAll();
oArray->FreeExtra();
delete oArray;
oArray = NULL;
}
catch(…)
{//do nothing}

(

Nicht einmal das funktioniert! Der läßt mein Speicher nicht frei!
Irgendetwas übersehe ich da!

Hallo Catmad,

Habe ich ebenfalls versucht. Beim Beenden des Programs wird
diese Funktion ausgeführt:

Ich schick dir mal per EMail ein Header-File das dir beim Suchen helfen kann.

Das File bindest du einfach ein, es „überschreibt“ die Operatoren new und delete durch eigene Implementierungen die Debug-Infos u. ä. ausgeben, bzw. auch beim zählen helfen wer wann wo Speicher allokiert hat und welcher wieder freigegeben wurde.

Schau einfach mal rein, dürfte relativ selbsterklärend sein.

Eine Website zu dem Thema ist: http://www.flipcode.com/tutorials/tut_memleak.shtml. Der Code der dort verwendet wird ist zwar nicht derselbe wie in dem Header-File das ich dir schicke, aber das Konzept ist dasselbe.

Grüße, Robert

1 Like

Hallo Catmad,

beim löschen von oArray werden die eingehängten Objekte nicht gelöscht, delete(oArray) löscht nur das Arrayobjekt, nicht die anderen 500000 mit new angelegten Objekte.

Deswegen:

for(i = 0; i GetSize(); i++)
{
delete((*oArray)[i]);
}
oArray -> RemoveAll();
delete(oArray);
oArray = NULL;

Gruß Patrick

(Umgebung: VC6.0, Windows2000)
Bei einem Zeiger eines CObArray wird der Speicher nach dem
löschen nicht freigegeben. Ein Beispiel:

CObArray * oArray = new CObArray;

for (int iPos=0; iPosAdd(dummy);
}

delete oArray;
oArray = NULL;

Laut Lehrbuch müsste hier doch das Programm den Speicherraum
von dem ObjektArray wieder freigeben. Das macht er aber nicht!
Was mache ich da falsch???

Danke für jede Antwort im Vorraus!

Ciao
Catmad

Ich habs gefunden!!!
Hallo!

Erst einmal vielen Dank an alle! Was würde ich ohne euch nur machen? :smile:)

So also das Problem hab ich folgendermaße gelöst:

CObjekt * pa;
int iSize = oArray->GetSize();
while(iSize >0)
{
pa = (CObjekt *) oArray->GetAt(iSize);
delete pa;
oArray->RemoveAt(iSize);
iSize–;
}

Ich hole mir einen Zeiger auf das Element und lösche es, dann mache ich einen RemoveAt und lösche auch die Position!
Yipi!

Ciao
Catmad