Warum ruft C++ std::list::clear() keine Destruktoren auf?
-
11-12-2019 - |
Frage
Schauen Sie sich diesen Code an:
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;
}
Und dann schauen Sie sich diese Ausgabe an:
Constructor
Destructor
Contructor
1
0
Die Frage ist:Warum wird der Destruktor des Listenelements nicht aufgerufen? l.clear()
?
Lösung
Ihre Liste ist von Zeigern.Zeiger haben keine Zerstörer.Wenn Sie möchten, dass der Zerstörer, der angerufen werden soll, sollten Sie stattdessen generasAnticetAgcode ausprobieren.
Andere Tipps
Eine bessere Alternative zum Freigeben von Zeigern mit delete
, oder etwas zu verwenden, das dies abstrahiert (z. B. intelligente Zeiger oder Zeigercontainer), besteht darin, die Objekte einfach direkt auf dem Stapel zu erstellen.
Sie sollten es vorziehen test t;
über test * t = new test();
Sie möchten sich sehr selten mit einem Zeiger befassen, der eine Ressource besitzt, sei sie intelligent oder nicht.
Wenn Sie a verwenden würden std::list
Wenn Sie „echte“ Elemente anstelle von Zeigern auf Elemente verwenden würden, hätten Sie dieses Problem nicht.