Si elimina un objeto, se llamará al destructor para ese objeto, por lo que debe hacer una eliminación en el destructor. Así que recuerde, todo lo que la clase ha asignado en el montón debe liberarse en el destructor. Si se ha asignado en la pila esto sucede automáticamente
struct A
{
A() { std::cout << "A()" << std::endl; ptr = new char[10]; }
~A() { std::cout << "~A()" << std::endl; delete []ptr; }
char *ptr;
};
Pero cuidado, si está utilizando la herencia, si A
hereda de una clase base, que necesita para hacer el destructor base virtual, o bien el destructor en A
no se llamará y tendrá una pérdida de memoria.
struct Base
{
virtual ~Base() {}
};
struct A : public Base
{
A() { std::cout << "A()" << std::endl; ptr = new char[10]; }
~A() { std::cout << "~A()" << std::endl; delete []ptr; }
char *ptr;
};
Y cuando define un destructor, debe definir también un constructor de copia y un operador de asignación de copia. [Ver aquí] (http://stackoverflow.com/questions/4172722/). –
@Space: Incorrecto ... La regla de tres no incluye * constructor *: [Ver wiki] (http://en.wikipedia.org/wiki/Rule_of_three_ (C% 2B% 2B_programming)) – Nawaz
@Nawaz: Gracias . Eso fue un error tipográfico ¿Mejor ahora? –