Beschädigung des Heaps



  • Fehler sehe ich erstmal keine. Welche Funktionen gibt es denn sonst noch in der Klasse? Bzw. versuche ein Minimalbeispiel zusammenzustellen, welches den Fehler verursacht.



  • Hallo,

    ich habe gerade das gleiche Problem bekommen. Habe die Klasse vector aber nicht selber geschrieben, sonder verwende std::vector.

    Irgendeine Idee?

    Danke!
    mfg,
    shed



  • shed schrieb:

    Irgendeine Idee?

    Bereichsüberschreitungen?

    vector::op[] überprüft nicht, ob es einen legalen Index bekommt - wenn du einen negativen Wert oder einen Wert >=size() übergibst, erzeugst du undefiniertes Verhalten. Und das kann im Ernstfall bedeuten, daß du wichtige Daten des Heap-Managers (oder schlimmeres) pulverisierst.



  • ich verwende eigentlich nur vector.push_back(), vector.pop_back() und vector.at(),
    d.h gebe ich ihm ja selbst keinen index mit.

    Muss ich da trotzdem aufpassen? 😕



  • hab ich bei stacks das gleich problem?
    Bzw. gibt es noch andere Möglichkeiten wann der Fehler auftreten kann außer bei verwendung eines vectors?



  • Der Fehler kann (naturgemäß) immer dann auftreten, wenn du auf dem Heap hantierst. Btw, es ist noch nicht einmal gesagt, daß der vector/stack den Fehler verursacht - viel wahrscheinlicher ist es, daß du von einem anderen Zeiger aus die Daten des vector's zerstört hast.

    (Zeig doch mal etwas Code)



  • Und das kann im Ernstfall bedeuten, daß du wichtige Daten des Heap-Managers (oder schlimmeres) pulverisierst.

    Was ist denn ein Heap-Manager ?!



  • Na, was denkst du ;)?

    Der Heap-Manager ist derjenige, der sich um die Speicherreservierungen auf dem Heap (new/delete oder malloc/free) kümmert und dafür sorgt, daß jeder soviel Speicher zugewiesen bekommt, wie er benötigt.



  • Das habe ich vermutet, jedoch hat mich die Aussage "Heap Manager zerstören" schon etwas stutzig gemacht ! Wie sollte man den Heap - Manager "zerstören" können ?



  • Indem Du einen Teil des Speicherbereichs überschreibst in dem new und delete zur runtime liegen... 🙄

    greetz, Swordfish



  • Ich habe hier eine ganz wage vermutung. Setz mal um deine beiden

    delete[] storage;
    

    eine if-Abfrage, dass das ganze jeweils so aussieht:

    if (storage != 0)
    {
    delete[] storage;
    }
    

    Ich lese nähmlich aus deiner Zeile hier:

    unsigned char* b = new unsigned char[newBytes];
    

    Dass deine storage-variable ein Pointer auf unsigned char ist, was ok ist, aber diese Zeile hier im konstruktor:

    storage = 0;
    

    Setzt eben diesen Pointer auf 0 (oder besser: NULL), wodurch es natürlich zum Fehler kommt, wenn du versuchst auf storage ein delete anzuwenden, so lange noch keine gültige Adresse dahinter liegt.

    Ich hoffe, es hilft was.

    Grüße
    FloFri



  • delete[] erkennt 0-Pointer selbst. Ein if(x) delete[] x; ist daher nicht nötig.

    Wenn du Probleme mit dem Heap hast, solltest du mal Valgrind benutzen oder wo das nicht verfügbar ist DUMA



  • mikey schrieb:

    Das habe ich vermutet, jedoch hat mich die Aussage "Heap Manager zerstören" schon etwas stutzig gemacht ! Wie sollte man den Heap - Manager "zerstören" können ?

    Da hast du etwas missverstanden - du zerstörst nicht "den Heap-Manager", sondern "wichtige Daten des Heap-Managers" (z.B. seine Notizen, wie lang jeder angeforderte Speicherbereich war).


Anmelden zum Antworten