仮想デストラクタと、ヒープにスペースを割り当てるという概念を理解しているかどうかはよくわかりません。次の例を見てみましょう。
class Base
{
public:
int a;
};
class Derived : public Base
{
public:
int b;
};
こういうことをしたら、と想像します。
Base *o = new Derived;
8 バイト (またはシステムで必要な 2 つの整数) がヒープに割り当てられます。これは次のようになります。| | b | ...
今私がこれを行うと:
delete o;
「delete」は、ヒープからすべてを削除するために、実際にはどのタイプの o であるかをどのように認識しますか? Base 型であると想定する必要があるため、ヒープから a のみを削除する必要があると思います (b がオブジェクト o に属しているかどうかを確認できないため)。b | ...
b はヒープに残り、アクセスできなくなります。
次のことを行います。
Base *o = new Derived;
delete o;
本当にメモリリークを引き起こしますか?ここで仮想デストラクタが必要ですか? または、delete は、o が実際には基底クラスではなく、派生クラスであることを認識していますか? もしそうなら、それはどのように機能しますか?
みんなありがとう。:)