Guardate questo codice:Perché C++ std :: list :: clear() non chiama i distruttori?
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;
}
E poi, guarda questa uscita:
Constructor
Destructor
Contructor
1
0
La domanda è: perché è il distruttore dell'elemento elenco non chiamato a l.clear()
?
Bello, è quello che pensavo ma volevo confermarlo. – danikaze
Oppure utilizzare Boost.PointerContainer's ['ptr_list'] (http://www.boost.org/doc/libs/release/libs/ptr_container/doc/ptr_list.html). –
Sì, uso SmartPointers per la maggior parte delle cose, ma a volte i puntatori grezzi sono migliori. La cosa è che ho pensato che se avessi un puntatore p, delete (p) è stato chiamato ... ma sapendo questo ora va bene. Libererò i puntatori grezzi. – danikaze