태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.
다음의 코드처럼 기반 클래스는 비가상함수로만 이루어져 vtable이 존재하지 않고, 해당 클래스를 상속한 하위클래스에는 가상함수가 있어 vtable이 포함될 때는 _BLOCK_TYPE_IS_VALID 런타임 에러가 발생한다.

class A{

public:

    void func(){}

    ~A(){}

};


class B : public A{

public:

    virtual void func(){}

    ~B(){}

};


int main(void){

    A* a = new B();

    delete a;  // error!


    return 0;

}


기반 클래스 A의 경우 가상 테이블 포인터가 없으므로 컴파일러가 1바이트 공간을 할당하지만 하위 클래스인 B의 경우 가상 테이블 포인터 때문에 4바이트의 공간이 할당된다.

따라서 해제될 때, A클래스의 소멸자가 1바이트만 인식하고 삭제를 하기 때문에 에러가 발생된다.

해결법은, 기반 클래스에도 vtable을 넣어주면 된다. void func()을 virtual void func()으로 고치거나, 소멸자를 가상 소멸자로 생성해준다. 
저작자 표시 비영리 변경 금지
Creative Commons License
Creative Commons License
http://www.iamscavenger.com/trackback/132 관련글 쓰기
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST