¿Por qué C++ std::list::clear() no llamar a los destructores?
-
11-12-2019 - |
Pregunta
Mira 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;
}
Y luego, mira esta salida:
Constructor
Destructor
Contructor
1
0
La pregunta es:¿Por qué es el destructor del elemento de la lista no se llama en l.clear()
?
Solución
Su lista de punteros.Los punteros no tiene destructores.Si desea que el destructor se llama usted debe tratar de list<test>
en su lugar.
Otros consejos
Una mejor alternativa para liberar el uso de punteros delete
, o el uso de algo que los resúmenes de distancia (tales como punteros inteligentes o puntero de contenedores), es simplemente crear los objetos directamente en la pila.
Se debe preferir test t;
más test * t = new test();
Muy rara vez quieren tratar con cualquier puntero que posee un recurso, inteligente o de otra manera.
Si usted fuera a utilizar una std::list
de lo 'real' de los elementos, en lugar de punteros a los elementos, no tendría este problema.