2016-11-19 179 views
2

我已經用構造函數和析構函數聲明瞭一個簡單的類。但是,當我刪除對象時,它會給出runtime error並且不會執行其他輸出。如何刪除此對象?

class Student { 
public: 
    string name; 

    Student(string name) { 
     this->name=name; 
    } 

    ~Student() { 
     this->name=""; 
    } 

}; 

int main() { 
    Student* s = new Student("a"); 
    cout<<s->name<<endl; 
    delete s;         /// Problem In This Line 
    cout<<"Name Here -> "<<s->name<<endl; 
    return 0; 
} 

這是什麼問題?我應該如何刪除或調用析構函數?

+4

刪除指針後,無法使用它。 –

+0

謝謝。我知道了。 @代碼學徒 – jbsu32

回答

2

你刪除一個指針後,您不能使用它。如果你想顯示你的析構函數工作,把它放在它裏面而不是在main()中。

2

什麼這裏是我的問題?我應該如何刪除或調用析構函數?

之後你delete s,對象不見了,所以你當然不能再訪問它了。在其生命週期外訪問對象是一種典型的未定義行爲。

對於你的情況,簡單地重新排列你的代碼會做。

cout<<"Name Here -> "<<s->name<<endl; 
delete s; 
1

正如@代碼學徒說。一旦你銷燬了這個對象,爲此目的而分配的內存就會被釋放,所以在你的例子中,你試圖訪問一塊未分配的內存,並導致所謂的NPE(NullPointerException)。

+0

在C中沒有NullPointerException異常++和指針指向的東西,它不是空 – Rakete1111

+0

的NullPointerException異常是描述指向空的潛在錯誤的一種方式。我忘了說這個異常是Java中所謂的。 儘管如此,你是對的。使用刪除後,內存被釋放並準備好再次使用,就是這樣。說它指向null是錯誤的,因爲這是建議在對象被銷燬後手動完成的。我在這個評論中糾正了自己,並添加了一個有趣的話題。 http://stackoverflow.com/questions/11603005/what-does-delete-command-really-do-for-memory-for-pointers-in-c – cizambra

1

它不可能調用從堆中其刪除後的東西。所以,如果你想使用此行

cout<<"Name Here -> "<<s->name<<endl;

,你應該在你以前使用過的方式重組程序刪除Student對象s

1

由於您已刪除的指針,調用它會就像去一個沒有任何東西的特定目標地址,並期待它做某件事。當指針超出範圍時,可以依靠析構函數自動重新分配堆中的內存。