Nel codice sorgente non vi è perdita di memoria, poiché non si dispone di alcuna variabile membro creata dinamicamente.
consideri l'esempio modificato sotto 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;
}
In questo caso l'uscita sarà,
Base Destructor called
In questo caso v'è una perdita di memoria, poiché 'b' viene creata dinamicamente usando 'nuovo' che dovrebbe essere cancellato usando la parola chiave 'cancella'. Poiché derv destructor non viene chiamato non viene cancellato, quindi c'è perdita di memoria.
Si consideri il caso di sotto del 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;
}
Nel caso 2 uscita sarà,
Derv Destructor called
Base Destructor called
In questo caso non c'è memoria leak.because derv distruttore viene chiamato e B è sempre cancellato.
Il distruttore può essere definito come virtuale nella classe base per assicurarsi che il distruttore di classe derivato venga chiamato quando si elimina il puntatore della classe base che punta all'oggetto di classe derivato.
Possiamo dire che "Il distruttore deve essere virtuale quando la classe derivata ha creato dinamicamente membri".
fonte
2012-01-06 12:37:08
È la classe base che ha bisogno di un distruttore virtuale. – Yuushi
@Mysticial: James ha questo. – Puppy
@James, hai detto che anche la classe base non ha alcuna funzione virtuale ma deve avere un distruttore virtuale se vogliamo ereditare la classe base ?? – Alok