2013-10-31 109 views
0

我有一個關於刪除一個對象和指針的問題。 第一次測試:類和指針刪除

a test; 
    a* test_ptr; 
    test_ptr = &test; 
    test.aPrint(); 
    test_ptr->aPrint(); 
    delete(test_ptr); 
    test.aPrint(); 

我在構造函數,析構函數中添加打印和功能aPrint打印文本 「aPrint」(OB)。

constructor 
aPrint 
aPrint 
destructor 
aPrint 
destructor 

我怎樣才能調用析構函數兩次? 如何刪除後仍然可以使用對象測試?

-----編輯-----

所以,如果我用新的,而不是。然後我必須使用刪除,否則我泄漏了。

a* test_ptr; 
test_ptr = new a; 
test_ptr->aPrint(); 
delete(test_ptr); 

這是因爲這個例子使用堆是第一個例子使用堆棧嗎?

回答

1

由於您的對象在堆棧上,因此當此對象超出範圍時,將調用其析構函數。

您正在刪除一次,並且編譯器正在隱式調用析構函數。

這就是爲什麼析構函數被調用兩次。

然而,這樣的程序的行爲沒有定義,並準備好任何雙重刪除的副作用。

+0

我明白了!感謝你的回答。 –

1

該對象未使用new進行分配,因此調用delete時出現未定義的行爲。只要讓它超出範圍,並且析構函數將自動調用(在您的示例中爲第二個調用)。