Beschädigung des Heaps
-
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. Einif(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).