2017-05-25 1 views
-4

Hier verwenden ist der Code-Snippet, das ich verwirrt:Zeiger zu löschen und ein Feld des gelöschten Objekts

T* pop(){ 
if(head == 0) 
     return 0; 
T* result = head->data; 
Link* oldHead = head; 
head = head->next; 
delete oldHead; 
return result; 
} 

Der result Zeiger maked verweisen auf das „Datenfeld“ des Kopfes des Objekts. Danach wird head gelöscht. Muss nicht result auf Null oder ein Leerzeichen zeigen, da das data Feld zusammen mit head gelöscht wird?

+0

Verwenden Sie für weniger Verwirrung [std :: stack <> '] (http://en.cppreference.com/w/cpp/container/stack). –

+0

Bereinigt Link Destructor Daten? wenn nicht dann nein. – Eddge

+0

Was ist Link? Was ist Kopf? Ich kann dein Beispiel nicht kompilieren ... –

Antwort

3

Nicht result weisen darauf ein Leerzeichen auf null oder da das data Feld zusammen mit head gelöscht wird?

Wenn Sie

delete oldHead; 

der Speicher für oldHead ausführen wird freigegeben. Jedoch, außer Sie auch delete data in der Destruktor Link, data weiterhin ein gültiger Zeiger ist. Daher ist es in Ordnung, result zurückzugeben und weiterhin den Rückgabewert in der aufrufenden Funktion zu verwenden.

Wenn Sie

Link::~Link() {} 

haben, gibt es kein Problem.

Wenn Sie jedoch

Link::~Link() { delete data; } 

haben, gibt es ein Problem.

+3

gepostet haben sollte, anstatt in einer Antwort zu raten, warum nicht warten, bis das OP einen [mcve] postet? –

+0

und jetzt wird diese "Antwort" als korrekt markiert ... wie sollen zukünftige Leser wissen, welches "wenn" gilt? –

+1

@ Ðàn, ein zukünftiger Leser wird wissen, ob es einen Fehler in seinem Code gibt, basierend auf dem Destruktor, den er benutzt. Ich verstehe nicht, warum das aus der Antwort nicht offensichtlich ist. –

Verwandte Themen