2017-05-04 35 views
1

我寫了這個分析類及其對內存釋放效應的析構函數的行爲,但結果似乎是有點令人驚訝的對我說:默認分解器V.S.一個簡單的定義析構函數

class test { 
public: 
    test() {} 
    ~test() {} //<-----Run the program once with and once without this line. 
}; 

int main() 
{ 
    test x; 
    test *a(&x); 
    cout << "a before memory allocation: " << a << endl; 
    a = new test; 
    cout << "a after memory allocation and before delete: " << a << endl; 
    delete a; 
    cout << "a after delete: " << a << endl; 

    return 0; 
} 

在默認析構函數結果是: enter image description here 但用我自己的析構函數是: enter image description here 第二個結果是不是錯誤?由於地方我讀到:

的釋放函數應解除分配由指針,渲染無效指解除了分配的存儲的任何部分,所有的指針引用的存儲。

也許我沒有正確地遵循它(特別是由於使用了困難的英文單詞!)。請你向我解釋爲什麼會發生這種情況? 我的簡單定義的析構函數和C++的默認析構函數之間有什麼區別? 感謝您的幫助提前。

+1

指針保持不變的事實與存儲解除分配的事實並不矛盾。這是可以重新使用的內存,使用剛剛刪除的指針訪問此內存將是您自己的錯。 – Gerriet

+0

@Gerriet你會舉一個例子嗎?謝謝。 –

+0

我無法使用默認析構函數重現指針修改:http://ideone.com/vg3TYD – UnholySheep

回答

2

如果a是一個(非空)指針到一個對象,則操作delete a觸發到a指向(默認析構函數或特定的一個)所述對象的析構函數,最後釋放已被存儲分配給這個對象。 a指向的內存不再是有效的對象,並且a不能再被解除引用。但是,delete a不會將指針a的值設置回特定值。其實我很驚訝delete a你的情況改變了價值a;我無法重現此行爲。

+1

某些編譯器(如Visual Studio for debug模式)會在刪除後將指針設置爲無效值,以幫助識別無效地址的解引用。 – Curg

相關問題