2013-02-05 1 views
1

, 내 프로그램은 런타임에 어설 션 오류 트리거 : ... _CrtlsValidHeapPointer (pUserData),하지만 코드는 나에게 좋아 보이는C++ 힙 오류 _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; 
} 

내 코드에 어떤 문제가 있습니까?

+2

나는 우리에게 보여주고있는 코드에 문제가 없다는 모호한 느낌이 있습니다. –

답변

3

A에 가상 소멸자가 필요합니다. 여기서는 아무 것도 할 필요가 없지만 virtual으로 선언해야합니다.

일반적으로 기본 유형에 대한 포인터를 통해 파생 유형의 객체를 삭제하는 경우 기본 유형 은 가상 소멸자가 있어야합니다 ().

+1

그것은 작동합니다, 당신 말이 맞아요! 고맙습니다! – Cristi