1

MSVC でコンパイルした後、私のプログラムは実行時にアサーション エラーをトリガーします: _CrtlsValidHeapPointer(pUserData)ですが、コードは問題ないように見えます...

class A
{
    int a;
public:
    A();
    A(int);
    virtual ~A();
    void setA(int);
    int getA();
    virtual void function()=0;
};

class B : virtual public A
{
    int b;
public:
    B();
    B(int,int);
    void setB(int);
    int getB();
    void function();
};

class C : virtual public A
{
    int c;
public:
    C();
    C(int,int);
    void setC(int);
    int getC();
    void function();
};

class D :public B,public C
{
    int d;
public:
    D();
    D(int,int,int,int);
    void setD(int);
    int getD();
    void function();
};

int _tmain(int argc, _TCHAR* argv[])
{
    A **p = new A*[4];
    int i;
    for(i=0;i<4;i++)
    {
        p[i]=new D(4,3,12,1);
    }
    for(i=0;i<4;i++)
    {
        p[i]->function();
    }
    for(i=0;i<4;i++)
    {
        delete p[i]; //the assertion fails when attempting to delete p[1]
    }
    delete[] p;
    system("pause");
    return 0;
}

コードの何が問題になっていますか?

4

1 に答える 1

3

に仮想デストラクタが必要ですA。ここでは何もする必要はありませんが、として宣言する必要がありますvirtual

一般に、基本型へのポインタを介して派生型のオブジェクトを削除する場合、基本型には仮想デストラクタが必要です。

于 2013-02-05T16:49:10.473 に答える