動的に作成されるメンバー変数がないため、ソースコードにはメモリリークはありません。 「B」は、動的に作成されるため、出力がされる。この場合
#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
:
ケース1以下の変形例を考えてみ'delete'キーワードを使用して削除する必要がある 'new'を使用します。 dervデストラクタは呼び出されていないので、削除されないので、メモリリークがあります。この場合、DERVのデストラクタleak.because全く記憶が呼び出されていないとbが取得されている
Derv Destructor called
Base Destructor called
、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を考えてみましょう削除されました。
Destructorは、派生クラスオブジェクトを指している基本クラスポインタを削除するときに派生クラスのデストラクタが呼び出されるように、基本クラスのVirtualとして定義できます。
「派生クラスが動的に作成されたメンバーを持つ場合、デストラクタは仮想でなければなりません」と言うことができます。
仮想デストラクタを必要とする基本クラスです。 – Yuushi
@神秘:ジェームズはこれを持っています。 – Puppy
@James、あなたは基本クラスにも仮想関数はないと言っていますが、基本クラスを継承したい場合は仮想デストラクタを必要としていますか? – Alok