Anfängerproblem: Freeing memory with delete verursacht ein Problem, das ich nicht erklären kann.
-
Huhu
Ich lese gerade den C++ Primer Plus (in English, deswegen weiss ich nicht genau, wie man dem oben sagt... Memory befreien mit delete, oder wie sagt man das auf Deutsch? ^^).
Ich habe folgenden Code:
int main() { using namespace std; int *test = new int[2]; test[0] = 2; test[1] = 4; cout << *test; test++; cout << *test; delete [] test; cin.get(); return 0; }Irgend etwas stimmt mit dem delte nicht. Ich habe auch über die Gefahren von delete was gelesen. Aber der Aufruf müsste meiner Meinung nach korrekt sein, denn ich habe den pointer ja mit new instanziert.
Es heisst jeweils "Debug Assertion Failed". Kann mir das jemand erklären?
*Edit:
Mir ist grad eingefallen, dass es am test++ liegen könnte und so ist es auch. Gibt es eine Möglichkeit wieder an den Ursprung des Pointer zu springen, so dass man das Memory trotzdem befreien kann? Oder wie sollte man das machen?
-
Schau mal unter decrement nach.

-
Du veränderst test ja zwischendurch. Woher soll delete denn dann wissen, dass es den Speicher freigeben soll, auf den test ursprünglich zeigte?
-
Es heißt "Speicher freigeben" ^^
Was spricht eigentlich gegen:
cout << test[0]; cout << test[1];Ansonsten musst du alles, was du hochzählst (meiner Meinung nach) wieder runterzählen...
Soweit ich weiß, versucht er sonst von der Stelle an der du bist den Speicher freizugen. Das heißt, er will "verbotenen" Speicher frei geben...
-
@drakon:
decrement kenne ich als Java Programmierer natürlich ^^@SeppJ
Ja, genau das habe ich befürchtet. Also müsste mal halt wieder entsprechend ein decrement verwenden, oder das ganze gleich einfach mit test[0], test[1], ...Wie wird das in der Praix gemacht, wird beides angewendet oder sollte man das test++ eher vermeiden?
*Edit:
@ DarkShadow44
Ahh, genau... "freigeben" hatte ich gesucht ^^
-
Also ich finde test++ ist
- gefährlicher
- unübersichtlicher
Besser ist es wenn du durch test "durchlaufen" wilst test[i] zu verwenden.
-
Jap, ich denke auch, dass test[i] besser ist.
Danke für die Antworten.
-
Und ganz egal, was wann besser sein mag - prinzipiell gilt immer:
Wenn Du Speicher dynamisch angefordert hast, musst Du Dir die zurückgegebene Adresse bis zum zugeöhörigen Freigeben irgendwo "merken"!So hättest Du ruhig test++ nehmen können ... aber vorher irgendwo den alten Wert ablegen (und dann darauf delete[])!
Gruß,
Simon2.
-
Ok, mach ich

Danke