"Heap Corruption" warum?



  • Hallo,

    ich bin in meinem Programm auf folgendes Problem gestoßen:

    HEAP CORRUPTION DETECTED: after Normal block (#2209) at 0x00ABD360.
    CRT detected that the application wrote to memory after end of heap buffer.
    Normal located at 0x00ABD360 is 24 bytes long.
    

    Ich habe auch die Stelle gefunden, welche dieses Problem verursacht.

    if (!exists){
    	    vec.push_back(new RedirectableLocalFolder(drive));
    	    RedirectableObject **obj = new RedirectableObject*[vec.size()+1];
    	    obj = enum_list;
    	    unsigned int i;
    	    for (i = 0; i < vec.size(); i++) {
    		obj[i] = vec[i];
    	    }
    	    // mark new end
    	    assert(_CrtCheckMemory());
    	    obj[i] = NULL; // HEAP Corruption
    	    assert(_CrtCheckMemory());
    	}
        }
    

    Nur leider versteh ich nicht wieso das Problem auftritt. 😕 obj[0] wird der Vektor vec[0] und obj[1] NULL zugewiesen. Speicher sollte meiner Meinung nach auch genügend allociert wurden sein. Wenn ich

    obj[i] = NULL; // HEAP Corruption
    

    nicht ausführen lasse, tritt der Fehler nicht auf.

    Kann mir das mal bitte jemand erklären 😞 ??
    Vielen Dank

    Robert



  • RedirectableObject **obj = new RedirectableObject*[vec.size()+1];
    obj = enum_list;
    

    Dir ist klar, was du mit so einer Aktion erreichst? Mit der zweiten Zeile vergisst du die Adresse des per new angelegten Bereiches und biegst obj um auf das Ziel von enum_list (wo immer das herkommt).

    PS: Darf man fragen, wozu dieser Code gut sein soll?



  • hmm, stimmt vollends. *mist*
    naja manchmal will man es einfach nicht sehen. *auf kopf klatsch*

    ich wollte an eine Liste von RedirectableObjects ein beliebiges Object anhängen. Die enum_list ist die bereits bestehende Liste. An diese soll das neue Object "angeflanscht" werden.



  • Und was ist in diesem Zusammenhang 'vec'? (und warum hantierst du noch mit nackten Pointern herum, wenn du doch die STL-Container dafür nutzen kannst?)



  • "vec" ist eine Vektor der die RedirectableObjects enthält. Das soll eine Erweiterung eines bereits vorhandenen Programmes werden. In diesem wird es bereits so verwendet um die vorhandenen Laufwerke zu enumerieren. Ich sollte die Möglichkeit einbauen einen weiteres lokales Verzeichnis dieser Liste hinzuzufügen, ohne dabei die Struktur des Programmes zu verändern.

    Achso ganz vergessen. Vielen Dank für die Hilfe. Hab das Problem nun gelöst 🙂


Anmelden zum Antworten