Hilfe, bitte? Finde den Ursprung der Heap-Corruption nicht
-
Hallo, Leute!
Ich brauch mal eure Hilfe. Ich bekomme manchmal beim delete eines char*-pointers die Meldung "Windows has triggered a breakpoint, this may be due to a corruption of the heap" und weiß nicht mehr, wo ich noch nachschauen soll. Folgendes habe ich ziemlich sicher überprüft:1. Ich habe nicht über den Rand geschrieben.
2. Ich habe es nicht schon deleted. (Nach jedem delete wird der Pointer auf 0 gesetzt oder einem neuen Speicherbereich zugewiesen.)
3. Der Speicherbereich exisitiert. Pointer ist nicht 0 oder 0xcccccccc und ist mit seinem ordentlichen Inhalt gefüllt. Der Speicherbereich ist z.B. 108Byte lang und bis pointer+107 hat er den korrekten Inhalt. Ab pointer+108 gibt es nur unformatierten Kram, den ich mal so gedeutet habe, dass er nicht von mir kommt, ich also nicht über den Rand geschrieben habe. Aber auch alle Methoden, die den Speicher anfassen, scheinen korrekt zu arbeiten.Gibt es sonst noch Auslöser für eine Heap Corruption, die ich überprüfen kann? Oder sollte ich die beiden ersten Punkte nochmal genauer ansehen?
Die fragliche Zeile sieht so aus:
if(chunks[currentProgram])delete chunks[currentProgram];ist ein bisschen wenig, aber den ganzen code kann ich euch wohl nicht zumuten.
Vielen Dank für jede Idee
Sören
-
Die Zeile die den Speicher mit new reserviert hat, möchte ich sehen.
Probiere malif(chunks[currentProgram]) delete [] chunks[currentProgram];
-
delete []
-
Ok, danke, aber mit delete[] lief es auch nicht. Aber gut zu wissen, dass das eigentlich dahin sollte. Es läuft ja auch manchmal. Ich poste mal die ganze funktion:
void ProgramChunkAdministrator::updateChunk() { if(chunks[currentProgram])delete[] chunks[currentProgram]; chunkSizes[currentProgram]=paramCombiner->getChunkSize()+specialParamCombiner->getChunkSize(); chunks[currentProgram]=new char[chunkSizes[currentProgram]]; char* chunkPointer=chunks[currentProgram]; paramCombiner->getChunk(chunkPointer); chunkPointer+=paramCombiner->getChunkSize(); specialParamCombiner->getChunk(chunkPointer); }Vielen Dank,nochmal
Sören
-
Achso, und nochwas: Wenn ich nicht debugge und einen Release-Build laufen lasse, treten keine Probleme auf. War da nicht irgendwas mit fehlerhaften nt.dlls oder so?
Grüße
Sören
-
das delete[]muss da nicht unbedingt hin. Das kommt darauf an wie chunks deklariert ist.
Aber aus der benutzung if(chunks[i]) ... kann man daraus schließen, dass es sich um einen pointer auf einen chunk handelt, und das wort interpretiert die allgemeinheit als ein array.Also es wäre wichtig, wenn diu die deklaration von der variablen mal zeigen würdest...
-
wurst schrieb:
das delete[]muss da nicht unbedingt hin. Das kommt darauf an wie chunks deklariert ist.
Aber aus der benutzung if(chunks[i]) ... kann man daraus schließen, dass es sich um einen pointer auf einen chunk handelt, und das wort interpretiert die allgemeinheit als ein array.Also es wäre wichtig, wenn diu die deklaration von der variablen mal zeigen würdest...
Ein Zeiger des Typs char*, der in einen Bereich zeigt, der größer als ein Byte ist, dürfte wohl die Array-Form benötigen, wie sich auch an der Zuweisung in updateChunk zeigt. Im gezeigten Code springt mir jedenfalls kein offensichtlicher Fehler ins Auge.
-
Nur das ist der Unterschied zwischen eine Beispiel überfliegen, und ein Beispiel anschauen.
-
chunks ist als char** deklariert. chunks[currentProgram] ist also ein char*. (muss doch auch so sein, wenn man " = new char[]" schreibt, oder?)
Naja, vielleicht liegt der Fehler auch ganz wo anders und tritt nur hier zum Vorschein, oder? Drum frag ich nochmal: Womit könnte ich denn den Heap runinieren? Was ungültiges deleten, über den rand schreiben, und sonst noch was? Bzw. Ist der Heap definitiv in der Nähe des besagten Arrays kaputt oder kann das auch an einer ganz anderen Stelle passiert sein?
Grüße und Danke
Sören
-
kann es auch sein, dass ich an anderer Stelle ein delete[] hätte einsetzen müssen und jetzt an dieser Stelle eine Heap corruption auftritt? Und wie sieht es eigentlich mit std::vector aus, in den ich pointer auf char-Arrays gesteckt hab. Wird beim delete dann die Array-Version genommen? Ansonsten: Wie bekomme ich den Pointer aus dem Vector gelöscht, ohne dass der vector selber den (falschen) destructor aufruft?
Grüße und Danke
Sören
-
So, hab jetzt rausgefunden, dass der Fehler bei ganz bestimmten größen nicht auftritt, bzw. wenn ich anstatt "char[chunkSize]" zu allozieren "int[chunkSize/4+1]" nehme. Funktioniert das jetzt, weil ich einen Puffer eingebaut habe (=also eher unsaubere Lösung, weil das eigentliche Problem nicht gefunden wurde)), oder kann das auch alignment-Gründe haben?
Vielen Dank
Sören
-
code?
-
Alles klar...
Der Fehler war ein strcpy_s, dem eine zu große Größe (count parameter) mitgegeben wurde. Ein strcpy macht alles wie gewollt, da die Größe des Ziels ja ausreicht. Fragt mich nicht, warum der strcpy_s da rumpfuscht, nur weil er denkt, dass der Zielstring da ja noch Platz hat...
Vielen Dank für Eure Mühe
Sören
-
söän schrieb:
Alles klar...
Der Fehler war ein strcpy_s, dem eine zu große Größe (count parameter) mitgegeben wurde. Ein strcpy macht alles wie gewollt, da die Größe des Ziels ja ausreicht. Fragt mich nicht, warum der strcpy_s da rumpfuscht, nur weil er denkt, dass der Zielstring da ja noch Platz hat...
Vielen Dank für Eure Mühe
SörenDas Witzige dabei ist, dass
strcpy_s()eigentlich die sichere Version vonstrcpy()darstellt... Dafür muss man eben aufpassen, dass man die richtigen Parameter übergibt