En su código fuente no hay pérdida de memoria, ya que no tiene ninguna variable miembro que se crea de forma dinámica.
Considere el ejemplo modificado debajo Caso 1:
#include <iostream>
using namespace std;
class base
{
int a;
public:
base() {a =0;}
~base()
{
cout<<"\nBase Destructor called";
}
};
class derv :public base
{
int *b;
public:
derv() { b = new int;}
~derv()
{
cout<<"\nDerv Destructor called";
delete b;
}
};
int main()
{
base *pb = new derv();
delete pb;
}
En este caso será la salida,
Base Destructor called
En este caso no es una pérdida de memoria, porque se crea 'b' dinámicamente usando 'nuevo' que debería eliminarse usando la palabra clave 'eliminar'. Como derv destructor no se está llamando, no se elimina, por lo que hay pérdida de memoria.
Consideremos el siguiente caso 2:
#include <iostream>
using namespace std;
class base
{
int a;
public:
base() {a =0;}
virtual ~base()
{
cout<<"\nBase Destructor called";
}
};
class derv :public base
{
int *b;
public:
derv() { b = new int;}
~derv()
{
cout<<"\nDerv Destructor called";
delete b;
}
};
int main()
{
base *pb = new derv();
delete pb;
}
En el caso de salida será de 2,
Derv Destructor called
Base Destructor called
En este caso no hay memoria leak.because destructor derv se llama yb es cada vez borrado
Destructor se puede definir como virtual en la clase base para asegurarse de que el destructor clase derivada que se llamará cuando borramos puntero de clase base que está apuntando al objeto de la clase derivada.
Podemos decir 'Destructor debe ser virtual cuando se derivan de clase ha creado dinámicamente miembros'.
Es la clase base que necesita un destructor virtual. – Yuushi
@Mysticial: James tiene este. – Puppy
@James, ¿Dijo que incluso la clase base no tiene ninguna función virtual, pero debe tener un destructor virtual si queremos heredar la clase base? – Alok