2017-05-25 81 views
-4

這裏的領域是代碼混淆了我的片段:刪除指針和使用已刪除對象

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

result指針maked指向頭部的對象的「數據字段」。之後,head被刪除。由於data字段與head一起被刪除,因此result不得不指向空格或空格。

+0

爲了減少混淆,請使用['std :: stack <>'](http://en.cppreference.com/w/cpp/container/stack)。 –

+0

鏈接析構函數是否清理數據?如果不是,那麼不。 – Eddge

+0

什麼是鏈接?什麼是頭?我不能編譯你的例子... –

回答

3

result得點,因爲data場與head一起刪除,爲空或空白空間?

當你執行

delete oldHead; 

的內存oldHead被釋放。但是,除非delete dataLink的析構函數中,data仍然是有效的指針。因此,可以返回result並繼續在調用函數中使用返回值。

如果你有

Link::~Link() {} 

是沒有問題的。

但是,如果你有

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

出現了問題。

+3

,而不是在答案中猜測,爲什麼不等待OP發佈[mcve]? –

+0

現在這個「答案」被標記爲正確的......未來的讀者應該怎麼知道哪個「如果」適用? –

+1

@多年以後,未來的讀者會根據他們正在使用的析構函數知道他們的代碼是否存在問題。我不明白爲什麼從答案中不明顯。 –