Perché c ++ std :: list :: chiaro () non chiamare i distruttori?
-
11-12-2019 - |
Domanda
Guarda questo codice:
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 dell'elenco non è chiamato l.clear()
?
Soluzione
La tua lista è di puntatori.I puntatori non hanno distruttori.Se vuoi che il distruttore venga chiamato, dovresti provare invece list<test>
.
Altri suggerimenti
Un'alternativa migliore per liberare i puntatori usando delete
o utilizzando qualcosa che astrasse a quello (come un puntatori intelligenti o contenitori di puntatore), è semplicemente creare gli oggetti direttamente sullo stack.
Dovresti preferire test t;
su test * t = new test();
Volete molto raramente desiderare di gestire qualsiasi puntatore che possiede una risorsa, intelligente o in altro modo.
Se dovessi usare un std::list
di elementi "reali", piuttosto che puntatori di elementi, non avresti questo problema.