Hilfe, bitte? Finde den Ursprung der Heap-Corruption nicht



  • 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...


  • Mod

    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


  • Mod

    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ören

    Das Witzige dabei ist, dass strcpy_s() eigentlich die sichere Version von strcpy() darstellt... Dafür muss man eben aufpassen, dass man die richtigen Parameter übergibt 😉


Anmelden zum Antworten