probleme mit heap
-
ich habe anscheinend probleme mit dem heap:
HEAP: Free Heap block 8b1150 modified at 8b11d0 after it was freedin meiner applikation habe ich auch ziemlich viele memcpy aufrufe und unmengen pointer. von daher ist es etwas schwierig nachzuvollziehen wo das problem genau liegt.
nach einiger suche bin ich dann auf folgendes gestossen:
http://blogs.msdn.com/greggm/archive/2004/04/16/114893.aspxdarin steht, dass es ein tool von micro... namens pageheap.exe gibt.
und weiter bei micro... heißt es (http://support.microsoft.com/default.aspx?scid=kb;en-us;Q286470#XSLTH3131121122120121120120)
es wäre bei den debuggintools dabei.ist es aber nicht. ich habe auch mit custom alles angewählt.
weiss jemand wo ich sonst dieses tool bekommen kann?
oder habt ihr noch andere tips für die eingrenzung des problems?
-
Du hast einen Heap-Bereich verändert, nachdem er (per delete) freigegeben wurde - um mal die Fehlermeldung zu übersetzen.
Das könnte damit zusammenhängen, daß du eine Klasse mit dynamischem Speicher verwendest und dort keinen passenden CopyCtor und Zuweisungsoperator definiert hast:
class test { char* val; public: test() : val(new char[10]) {} ~test() {delete[] val;} void set_val(int p, char c) {val[p]=c;} char get_val(int p) {return val[p];} } int main() { test t1;//ruft Standard-Destruktor auf if(t1.get_val(0)==0) { test t2=t1;//Default-CopyCtor -> t2.val = t1.val ... }//t2.~test() - löscht Datenbereich hinter t2.val (und t1.val) t1.set_val(1,'j');//<-CRASH }
-
naja, ich mach sowas in der art:
char* pointerArray = new char[256]; char* pointerArray2 = new char[512]; ... if(pointerArray) { delete [] pointerArray; pointerArray = 0; } pointerArray = pointerArray2;
-
Soweit sieht es noch gut aus - aber wenn du jetzt auf einen dieser Pointer delete anwendest, hast du ein Problem:
char* pointerArray = new char[256]; char* pointerArray2 = new char[512]; ... if(pointerArray) { delete [] pointerArray; pointerArray = 0; } pointerArray = pointerArray2; ... if(pointerArray) { delete [] pointerArray; pointerArray = 0; } ... strcpy(pointerArray2[0],"Hallo, Heap!");// CRASHNach deinem Programmfragment hast du nur noch EINEN Heap-Sektor, auf den beide Pointer verweisen - wenn du den löschst, zeigen beide Pointer auf ungültige Daten.
PS: Sei froh, daß du darauf hingewiesen wurdest - schlimmer wird es, wenn du auf diese Weise Daten zerstörst, die du inzwischen neu angelegt hast.
-
o.k.
noch konkreter: ich möchte daten zu einem speicherbereich hinzufügen.
wenn dieser voll ist// pointer Array wird am anfang einmal GLOBAL angelegt char* pointerArray = new char[256]; void fuegWasHinzu(void* vonWo, int wieViel) { while(nochPlatz < wieViel) { char* pointerArray2 = new char[LENPOINTERARRAY+512]; memcpy(pointerArray2, pointerArray, 256); if(pointerArray) { delete [] pointerArray; pointerArray = 0; } pointerArray = pointerArray2; } strcpy(pointerArray, vonWo, wieViel); }
-
Mal davon abgesehen, daß du so eine Endlosschleife erzeugst (nochPlatz wird in der Schleife nicht erhöht), spätestens beim zweiten Überlauf die Hälfte deiner Daten kompostierst und strcpy die bisher belegten Daten überschreibt - blicke ich schon kaum noch durch deine Speicherverwaltung durch.
-
if(pointerArray) { delete [] pointerArray; pointerArray = 0; }BTW: Delete[] überprüft automatisch ob es sich um einen 0 Zeiger handelt.
mfg.