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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top