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()?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top