2012-09-30 60 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)被稱爲...但現在知道這沒關係。我會釋放原始指針。 – danikaze

3

使用delete或使用抽象出來的東西(比如智能指針或指針容器)來釋放指針的更好方法是直接在堆棧上直接創建對象。

你應該更喜歡test t;而不是test * t = new test();你很少想要處理任何擁有資源的智能指針或其他指針。

如果您要使用「真實」元素的std::list而不是指向元素的指針,則不會出現此問題。

相關問題