2012-09-30 11 views
6

ルック:C++ std :: list :: clear()がデストラクタを呼び出さないのはなぜですか?このコードでは

class test 
{ 
    public: 
     test() { cout << "Constructor" << endl; }; 
     virtual ~test() { cout << "Destructor" << endl; }; 
}; 

int main(int argc, char* argv[]) 
{ 
    test* t = new test(); 
    delete(t); 
    list<test*> l; 
    l.push_back(DNEW test()); 
    cout << l.size() << endl; 
    l.clear(); 
    cout << l.size() << endl; 
} 

そして、この出力を見て:

Constructor 
    Destructor 
    Contructor 
    1 
    0 

質問は:なぜl.clear()でリスト要素のデストラクタと呼ばれていませんか?

答えて

12

あなたのリストはポインタです。ポインタにはデストラクタがありません。デストラクタを呼び出すには、代わりにlist<test>を試してください。

+0

ニース、それは私が思ったものですが、私はそれを確認したかったのです。 – danikaze

+0

またはBoost.PointerContainerの['ptr_list'](http://www.boost.org/doc/libs/release/libs/ptr_container/doc/ptr_list.html)を使用してください。 –

+1

ええ、私はSmartPointersをほとんどのものに使用していますが、時には生のポインタが優れています。 私はポインタpを持っていれば削除(p)が呼び出されたと思っていますが、これを知っていればOKです。私は生のポインタを解放します。 – danikaze

3

deleteを使用してポインタを解放するより良い代替方法(スマートポインタやポインタコンテナなど)を抽象化する方法を使用すると、オブジェクトをスタックに直接作成することができます。

test t;以上test * t = new test();あなたはごくまれに、リソース、スマートその他を所有するポインタを扱うことはほとんどありません。

要素のポインタではなく、実際の要素のstd::listを使用する場合、この問題は発生しません。

関連する問題