В вашем исходном коде нет утечки памяти, поскольку у вас нет динамической переменной-члена, созданной.
Рассмотрим измененный пример, приведенный ниже. Случай 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;
}
В этом случае выходные данные будут:
Base Destructor called
. В этом случае возникает утечка памяти, поскольку «b» создается динамически с использованием «new», которое следует удалить с помощью ключевого слова «delete».Поскольку деструктор дерв не вызывается, он не удаляется, поэтому имеется утечка памяти.
Рассмотрим приведенный ниже случай 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;
}
В случае вывода 2 будет:
Derv Destructor called
Base Destructor called
В этом случае утечка памяти отсутствует. Потому что вызывается деструктор derv и удаляется b.
Деструктор может быть определен как виртуальный в базовом классе, чтобы обеспечить вызов деструктора производного класса примы удаляем указатель базового класса, который указывает на объект производного класса.
Мы можем сказать: «Разрушитель должен быть виртуальным, если производный класс имеет динамически создаваемые члены».