私は派生クラスがその基本クラスへのポインタと型互換性があることを理解します。与えられたサンプルコードではnew bar
のオブジェクト構築が行われ、foo::foo()
とそれに続くbar::bar()
が呼び出されます。それぞれのコンストラクタでは、クラスメンバfoo::int *a
とbar::int *b
にリソースを割り当てています。ベースクラスへの派生クラス型の互換性はメモリリークの原因になりますか?
これで、構築されたオブジェクトを基本クラス型に初期化しています。 obj
では、私は基本クラスのデストラクタを呼び出すことはできますが、派生クラスのデストラクタは呼び出すことはできません。では、この場合、派生クラスのリソースをどのように割り当て解除できますか?これはメモリーリークではありませんか?
#include <iostream>
class foo
{
int *a;
public:
foo()
{
a = new int[5];
std::cout << "\n foo constructor" << std::endl;
}
~foo()
{
std::cout << "\n foo destructor" << std::endl;
delete[] a;
}
};
class bar : public foo
{
int *b;
public:
bar()
{
b = new int[5];
std::cout << "\n bar constructor" << std::endl;
}
~bar()
{
std::cout << "\n bar destructor" << std::endl;
delete[] b;
}
};
int main()
{
foo *obj = new bar; // Derived class object is type compatible with base class
delete obj; // Equivalent to obj->~foo();
return 0;
}
ありがとうございます。
実際のコードでは、リソースを管理するすべてのクラスに対して、ルール3を実行し、デストラクタ、コピーコンストラクタ、およびコピー代入演算子を宣言する必要があります。 –
http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three "Rule of Three" – Mahesh