ソース コードには、動的に作成されるメンバー変数がないため、メモリ リークはありません。
ケース 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
この場合、'delete' キーワードを使用して削除する必要がある 'new' を使用して 'b' が動的に作成されるため、メモリ リークが発生します。derv デストラクタが呼び出されていないため、削除されていないため、メモリ リークが発生しています。
以下のケース 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 が削除されるため、メモリ リークは発生しません。
デストラクタは、基本クラスで Virtual として定義して、派生クラス オブジェクトを指している基本クラス ポインタを削除するときに、派生クラス デストラクタが確実に呼び出されるようにすることができます。
「派生クラスが動的にメンバーを作成した場合、デストラクタは仮想でなければならない」と言えます。