2

私は3つのクラスを持っています

class A
{
    A();
    virtual ~A();
}
class B : public A
{
    B();
    ~B();
}
class C
{
    void *obj;
    C() : obj(nullptr) {}
    ~C() { if (obj) delete obj; }
}

Cクラスの子のコンテナとしてクラスを使用し、インスタンスAを削除しようとすると。、デストラクタが呼び出されていないのは正常ですか? 解決策は何ですか?CAB

C* instance = new C();
instance.obj = new B();
//Magic
delete instance; // A and B destructor is not called
4

3 に答える 3

12

互換性のない型 ( を含むvoid) へのポインタを削除すると、未定義の動作が発生します。

解決策は何ですか?

  • 正しいタイプを使用してください。 で指定したタイプnew、または仮想デストラクタがある場合は基本クラスのいずれかです。また
  • use std::shared_ptr<void>、initialized from std::shared_ptr<correct_type>: そのデリータは正しいことを行います。

この場合、 「クラスの子のコンテナ」であるべきだと言っているので、A*単に保存できるように見えます。void*A

ちなみに、ポインターを削除する前に null かどうかを確認する必要はありません。

于 2013-10-03T12:06:55.543 に答える