2017-02-13 5 views
2

この例を考えてみましょう:デストラクタは、オブジェクトの後に呼び出されていないスコープの外に出る

#include <iostream> 
using namespace std; 

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

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

なぜ「デストラクタOK!」 2回印刷されませんか?なぜローカルオブジェクト "test"のデストラクタが呼び出されないのですか?

デストラクタをプライベートにすると、delete pTestのコンパイルエラーしかないことに気付きました。ローカルオブジェクトに対しては有効ではありませんか?ここで何が起こっていますか?

+0

OK。だからそれはほとんどだ。私が愚かな狩りをするときに、それがほとんどの人であるか非人である人であるかを覚えていない。 – user4581301

+1

コンストラクタも呼び出されないので、これは問題ありません。 – AnT

答えて

7

この行は実際には変数ではなく関数を宣言します。

MyClass test(); 

あなたは均一な初期化構文に変更した場合、次の2つのdestuctorが

MyClass test{}; 

または

auto test = MyClass(); 
+1

完全性のために、これは「Most Vexing Parse」と呼ばれています。 OPがそれを後で検索できるように注意するのは良いことかもしれません。 :-) – templatetypedef

+3

@templatetypedefこれは最も厄介な構文解析ではありません – NathanOliver

+0

OK、私はmain()内に関数プロトタイプを入れることはできないと思っていましたが、明らかに実装を入れることはできません... – Aminos

2

を呼び出して参照してくださいね "MyClassのテスト();" - MyClass test;と書いたければ、オブジェクトを作成していないので、引数を取らずに "MyClass"を返す関数 "test"を宣言しています。

関連する問題