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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top