Por que C++ std::list::clear() não está chamando destruidores?
-
11-12-2019 - |
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()
?
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.