2015-09-26 48 views
0

我真的很難理解指針,所以請原諒我這個問題可能有任何含糊之處。是的,我提出了不止一個問題,但標題中的問題是迄今爲止最重要的問題。其他問題只是我非常感謝你回答的問題。因此,可以說我有一個類,它看起來是這樣的:我應該刪除一個指向類的解構器(C++)中的int的指針嗎?

class myclass 
{ 
public: 
    myclass(); 
    ~myclass(); 
private: 
    struct node 
    { 
     node * next; 
    } 
    node * head; 
    int myint; 
} 

現在,因爲我知道,人們會呼籲各爲類和結構構造,以及deconstructors。我被告知不應該在解構器中刪除整數,但是刪除指向整數的指針呢?不應該像這樣在解構器中刪除:

myclass::~myclass 
{ 
    delete head; 
    delete &myint; 
} 

如果沒有,爲什麼?

如果您只想回答該問題,請不要再閱讀。爲了簡便起見,我的下一個問題是關於這個代碼,上面的解構,這是我一直在說是錯誤的(假設這是相同的文件上面的解構的一部分):

myclass::node::~node 
{ 
    delete next; 
} 

更多具體來說,我被告知我不應該刪除節點,除非它們已被聲明爲new標記。不用說,我覺得很混亂。如果可以的話,你能解釋一下它們的含義嗎?爲什麼他們說的是真的?解釋這一點的鏈接同樣值得讚賞,只是明白我是編程新手,幾個月前我剛開始學習C++。

+1

規則很簡單:如果你分配它,你需要最終釋放它。 – Barmar

+1

http://stackoverflow.com/questions/5727/what-are-the-barriers-to-understanding-pointers-and-what-c​​an-be-done-to-overcome?lq=1 – Barmar

+1

@Barmar這是唯一的這一點提高了我對指針的理解。謝謝! – Larrimus

回答

1

您只能在使用new動態分配的內存上使用delete

就你而言,myint不是一個單獨的動態分配內存塊。它是myclass對象的成員,其內存不能與包含對象分開管理。當您分配myclass對象(作爲普通變量或動態使用new myclass)時,將分配其所有成員;當你釋放它時,它的所有內存將被回收。您不需要刪除個人會員。

+1

儘管如此,我從來不需要調用解構器。我將來是否需要召集班級的解構主義者,更復雜的程序? – Larrimus

+0

你不直接調用解構器,它會自動爲你完成。無論是何時刪除指向該對象的指針,還是包含該對象的變量超出範圍。 – Barmar

+1

但是,當指針超出範圍時,指針指向的對象(或其他內存)不會被釋放。 – Larrimus

1

否,則應該只在指針存儲器已經通過new分配使用delete,按照C++標準的§5.3.5/ 1:

該刪除表達式運算符銷燬大多數衍生對象(1.8)或由新表達式創建的數組。


事實上,關於編寫好的C++代碼,你甚至不應該delete該指針自己,只需使用一個std::unique_ptr,讓默認的析構函數處理這個問題。

+1

好的,但爲什麼是這種情況? – Larrimus

+0

因爲這是'delete'唯一可以做的事情,所以釋放使用'new'分配的內存。 – Barmar

+0

@Larrimus否則內存將被刪除兩次,一次當您調用delete時,一次當變量超出範圍時。那很不好!!! –

相關問題