2012-09-30 18 views
6

Görünüş:Neden C++ std :: list :: clear() destructor'ları çağırmıyor? Bu koda

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; 
} 

Ve sonra, bu çıkış bakmak:

Constructor 
    Destructor 
    Contructor 
    1 
    0 

soru şudur: Neden l.clear() de aramadı liste elemanının Yıkıcı mı?

cevap

12

Listeniz işaretçilerden oluşmaktadır. İşaretçilerde yıkıcılar yok. Eğer yok edicinin aranmasını istiyorsanız, bunun yerine list<test>'u deneyin.

+0

Güzel, düşündüğüm buydu ama onaylamak istedim. – danikaze

+0

Veya Boost.PointerContainer's ['ptr_list'] (http://www.boost.org/doc/libs/release/libs/ptr_container/doc/ptr_list.html) kullanın. –

+1

Evet, çoğu şey için SmartPointer'ları kullanıyorum, ancak bir takım ham işaretçiler daha iyi. Şey, bir p işaretçisiysem, sil (p) denildi ... ama şimdi bunu bilmek iyi olur diye düşündüm. Ham işaretçileri serbest bırakacağım. – danikaze

3

delete kullanarak işaretçilerin serbest bırakılması için daha iyi bir alternatif ya da bunu (bir akıllı işaretçiler veya işaretçi kapları gibi) özetleyen bir şey kullanmak, nesneleri doğrudan yığın üzerinde oluşturmaktır.

test * t = new test(); üzerinde test t;'u tercih etmelisiniz. Çok nadiren, bir kaynağın akıllı veya başka bir kaynağı olan herhangi bir işaretçi ile ilgilenmek istersiniz.

std::list öğelerini, öğelerin göstergelerini değil, 'gerçek' öğelerinizdeyseniz, bu sorunla karşılaşmazsınız.