Pourquoi C++ std::list::clear() n'appelle-t-il pas de destructeurs ?
-
11-12-2019 - |
Question
Regardez ce code :
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;
}
Et puis, regardez cette sortie :
Constructor
Destructor
Contructor
1
0
La question est:Pourquoi le destructeur de l'élément de liste n'est-il pas appelé à l.clear()
?
La solution
Votre liste est composée de pointeurs.Les pointeurs n'ont pas de destructeurs.Si vous voulez que le destructeur soit appelé, vous devriez essayer list<test>
plutôt.
Autres conseils
Une meilleure alternative à la libération des pointeurs en utilisant delete
, ou utiliser quelque chose qui résume cela (comme des pointeurs intelligents ou des conteneurs de pointeurs), consiste simplement à créer les objets directement sur la pile.
Tu devrais préférer test t;
sur test * t = new test();
Vous souhaitez très rarement traiter avec un pointeur possédant une ressource, intelligente ou autre.
Si vous deviez utiliser un std::list
d'éléments « réels », plutôt que de pointeurs vers des éléments, vous n'auriez pas ce problème.