Heap Fehler mit std::string
-
Hi an alle,
gibt es irgendwelche bekannten Probleme mit den strings der STL?
Ich bekomme dauernd Heap Corruption Detected im Debug Mode beim ausführen von delete auf ein mit new initialisiertes Objekt.Ich kann aber nichts finden wo der Heap korrumpiert sein soll.
Gruß
Karsten
-
"bekannten Probleme mit den strings der STL"
nein, wird dein fehler sein... (2x delete auf ein new z.bsp.)zeig mal ein wenig quellcode, wenn du es mit dem debugger nicht selbst finden solltest...
bb
-
g_pSip = new CSip(sTest, sTest2); if(!g_pSip->Initialize()) { if(g_pSip != NULL) { delete g_pSip; //Hier Absturz destruktor hat nichts zum Abarbeiten g_pSip = NULL; } return false; }ich habe schon alles geschaut auf dieses Objekt wird definitiv keine 2tes Delete ausgeführt.
Auch nicht innerhalb der Klasse wird irgendein Objekt 2 mal gelöscht.Vllt. noch alles Hinweis die Fehlermeldung besagt crt meldet das die App Speicher nach dem Ende des Heaps schreibt???
Klicke ich auf Continue läuft die App ganz normal weiter bis sie wieder versucht an dieser Stelle das Objekt versucht zu initalisieren.
-
Der Fehler wird vermutlich vor der delete-Anweisung stehen, er wird aber erst dann bemerkt.
-
Das ist schon möglich, nur wo???
Und warum tritt dies nur im Debug Mode auf und in der
Release läuft er problemlos durch???
-
-
@ Probe-Nutzer.
Danke für die Tipps. Hab jetzt mal ein wenig mit _CrtCheckMemory geprüft.
Bevorg_pSip = new CSip(....)
gibt die Funktion noch 1 zurück.
Sobald im Konstruktor _CrtCheckMemory ausgeführt wird also direkt als erste Anweisung im Konstruktor wird 0 zurückgegeben.Jetzt weiß ich nicht ob es normal ist das die Funktion im Konstruktor des Objekts nicht korrekt funktioniert oder ob mit den Parametern schon was falsch läuft.
-
Das hier z.Bsp.:
g_pSip = new CSip(sTest, sTest2); if(!g_pSip->Initialize()) { if(g_pSip != NULL) { delete g_pSip; //Hier Absturz destruktor hat nichts zum Abarbeiten g_pSip = NULL; } return false; }sieht mir so aus, als ob du uns zw. dem new und init ne ganze menge verschwiegen hast, wenn nicht:
g_pSip = new CSip(sTest, sTest2); if(!g_pSip->Initialize()) { delete g_pSip; //Hier Absturz destruktor hat nichts zum Abarbeiten return false; }macht genau das gleiche...
ansonsten sind die häufigsten ursachen (wie in dem thread auch geschrieben der vom compiler generierte copy-ctor/assignmet op, wenn man mit rohen pointern arbeitet).
wenn das bei dir nicht der fall ist, wird es ein bisschen schwer zu finden
den blog hab ich mir noch nicht durchgelesen, aber bisher hab ich wenige bug-finding-wege gesehen, die zwischenzeitlich den (zumindest den ungeübten^^) Programmierer eher verwirrt haben...bb
-
Also in Initialize wird kein Speicher reserviert nur einige Zufallsnummern erzeugt und geprüft ob die im Konstruktor übergebenen Parameter korrekt sind.
Also einfach mal mit nem eigenen Copy ctor probieren?
-
Fehler gefunden.
Struct Alignement auf 1 Byte gesetzt jetzt kommt auch kein Fehler mehr
-
CrazyPlaya schrieb:
Fehler gefunden.
Struct Alignement auf 1 Byte gesetzt jetzt kommt auch kein Fehler mehr
Ohne die Details zu kennen: das hört sich eher danach an, als hättest du das Symptom kurzzeitig unterdrückt, statt tatsächlich den Fehler gefunden zu haben.
Deiner Beschreibung nach zerschießt du dir irgendwo den Heap. Das muss nicht direkt mit der Stelle zusammenhängen, wo die Fehlermeldung kommt. Vor allem kann man so einen Fehler nicht durch Anpassung des Alignments beheben.
Oh, und dein Code läuft natürlich nicht mit optimaler Geschwindigkeit mit 1-byte-alignment.