2016-09-13 5 views
1

デストラクタが保護されている場合、スタック上のオブジェクトの割り当てはできませんが、ヒープ上での割り当ては許可されていますか?ヒープとデスティネーション間のオブジェクトデスティネーションの割り当て

class Foo 
{ 
    public: 
    Foo() 
    { 
    } 
    protected: 
    ~Foo() 
    { 
    } 
}; 

int main() 
{ 
    Foo* objOnHeap = new Foo(); // compiles fine 
    Foo objOnStack; // complains that the destructor is protected 
    return 0; 
} 
+2

あなたは 'delete'によってそれを破壊していないので、dtorはまったく呼び出されません。 – songyuanyao

+0

ヒープ上のオブジェクトに対して 'delete'を呼び出さなかった。スタック上のオブジェクトの場合、スコープから外れると削除されます。 – arunmoezhi

+0

はいこれは違いです。 dtorが呼び出されるかどうか。 (暗黙的にまたは明示的には関係ありません) – songyuanyao

答えて

3

あなたは自動記憶域期間(あなたは「スタック上」と呼んでいるもののための標準的な用語)を持つオブジェクトを作成すると、オブジェクトがスコープの外に出たとき、それは暗黙的に破棄されます。これには、一般にアクセス可能なデストラクタが必要です。 newでオブジェクトを動的に割り当てると、これは起こりません。動的に割り当てられたオブジェクトは、明示的に行う場合にのみ破棄されます(たとえば、delete)。あなたはそれをやろうとしているわけではないので、間違いはありません。

delete objOnHeap; 
+0

ああ..意味があります。ありがとう。 – arunmoezhi

+0

良い説明。この** std :: unique_ptr p(new Foo()); **は、内部での削除を使用するので、不平を言います。 – blackpen

関連する問題