2017-02-13 57 views
2

考慮這個例子:「析構函數OK」析構函數的對象後不會被調用超出範圍

#include <iostream> 
using namespace std; 

class MyClass 
{ 
public: 
    ~MyClass() { cout << "DTOR OK !" << endl; } 
}; 

int main(void) 
{ 
    MyClass test(); 
    MyClass* pTest = new MyClass(); 
    delete pTest; 
} 

爲什麼不打印兩次?爲什麼不調用本地對象「測試」的析構函數?

當析構函數是私有的時候,我發現刪除pTest只有一個編譯錯誤;但不適用於本地對象?這裏發生了什麼事 ?

+0

好的。所以它是最重要的。我不記得當我瞎狩獵的時候它是最多的還是非最多的。 – user4581301

+1

可以,因爲構造函數也沒有被調用。 – AnT

回答

7

該行實際上聲明瞭一個函數,而不是一個變量。

MyClass test(); 

如果你要改變統一初始化語法,你會看到兩個destuctor調用

MyClass test{}; 

auto test = MyClass(); 
+1

爲了完整起見,這被稱爲「最煩人的解析」。可能需要注意的是,以便OP可以稍後進行搜索。 :-) – templatetypedef

+3

@templatetypedef這不是最令人頭疼的解析 – NathanOliver

+0

好吧,我認爲我們不能把函數原型放在main()裏面,但顯然我們不能只把實現放在裏面...... – Aminos

2

「MyClass的測試();」 - 你想寫MyClass test; - 你沒有創建一個對象,你聲明瞭一個函數「test」,它不接受任何參數並返回一個「MyClass」。

相關問題