delete verständnisfrage
-
hey guys
wieso funktioniert das:
#include <iostream> #include <string> using namespace std ; struct liste { string name ; int id ; liste* next ; }; int main ( ) { liste* Daten = new liste ; Daten->id = 1 ; Daten->name = "Max" ; Daten->next = new liste ; Daten->next->id = 2 ; Daten->next->name = "Moriz" ; cout << "ID: " << Daten->id << endl ; cout << "Name: " << Daten->name << endl ; cout << "ID: " << Daten->next->id << endl ; cout << "Name: " << Daten->next->name << endl ; delete Daten->next ; delete Daten ; Daten->id = 14 ; cout << "ID: " << Daten->id << endl ; }Output: ID: 1 Name: Max ID: 2 Name: Moriz ID: 14 // Wieso? Sollte doch nicht gehen, weil ich Daten gelöscht habedanke im voraus
-
Das, was du da fabriziert hast, heisst Undefined Behaviour. Es ist nicht vorhersehbar, wie dein Programm reagieren wird, es kann sein, dass lange nichts passiert und irgendwo in einem anderen Teil deines Programms plötzlich Blödsinn berechnet wird oder das Programm wird sofort beendet. Dazwischen ist so ziemlich alles möglich.
-
asdfghj schrieb:
wieso funktioniert das
Weil C++ dich nicht daran hindert, Unsinn zu programmieren. Dein Code erzeugt undefiniertes Verhalten, d.h. es muss nicht unbedingt funktionieren. Je nach Compiler, Zustand des Arbeitsspeichers oder der momentanen Wetterlage kann das Programm auch abstürzen, andere Daten überschreiben oder sonst irgendwas nicht Nachvollziehbares bewirken. Sich auf solche Dinge verlassen sollte man folglich nicht.
-
Das delete macht folgendes:
a) es ruft den Destruktor auf
b) es sagt dem Betriebssystem das es den Speicherbereich nicht mehr brauchtWenn du jetzt wieder auf das Objekt zugreifst, passiert eines der folgenden:
a) der Speicher wurde noch nicht wieder vom Betriebssystem zurückgeholt und du benutzt ihn auch nicht erneut: du bekommst deine alten Daten immer noch
b) der Speicher wurde noch nicht wieder vom Betriebssystem zurückgeholt und du benutzt ihn selbst für was neues: du bekommst die Daten die dann dort stehen, kann Müll sein weil anderer Datentyp etc.
c) der Speicher wurde vom Betriebssystem zurückgeholt: Crash.
-
ahhhh thanks!!!
-
Mich würde interessieren, wie Du auf ein drittes oder viertes Element deiner Linearen Liste zugreifst. Ich möchte das auch lernen und bitte daher um ein weiteres Beispiel.
lg, asddd