Spójrz na ten kod:Dlaczego C++ std :: list :: clear() nie wywołuje destruktorów?
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;
}
A potem spojrzeć na tego wyjścia:
Constructor
Destructor
Contructor
1
0
Pytanie brzmi: Dlaczego destruktor elementu listy nie zawinął l.clear()
?
Fajnie, tak właśnie myślałem, ale chciałem to potwierdzić. – danikaze
Lub użyj Boost.PointerContainer's ['ptr_list'] (http://www.boost.org/doc/libs/release/libs/ptr_container/doc/ptr_list.html). –
Tak, używam SmartPointers dla większości rzeczy, ale czasami surowe wskaźniki są lepsze. Chodzi o to, że myślałem, że jeśli mam wskaźnik p, to usunięto (p) ... ale wiedząc, że teraz jest w porządku. Uwolnię surowe wskazówki. – danikaze