Pergunta

Veja este código:

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 então, veja esta saída:

    Constructor
    Destructor
    Contructor
    1
    0

A questão é:Por que o destruidor do elemento da lista não é chamado em l.clear()?

Foi útil?

Solução

Sua lista é de dicas.Ponteiros não possuem destruidores.Se você quiser que o destruidor seja chamado, você deve tentar list<test> em vez de.

Outras dicas

Uma alternativa melhor para liberar ponteiros usando delete, ou usar algo que abstraia isso (como ponteiros inteligentes ou contêineres de ponteiros), é simplesmente criar os objetos diretamente na pilha.

Você deveria preferir test t; sobre test * t = new test(); Muito raramente você deseja lidar com qualquer ponteiro que possua um recurso, inteligente ou não.

Se você usasse um std::list de elementos 'reais', em vez de ponteiros para elementos, você não teria esse problema.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top