2016-09-22 11 views
1

b 누구 정적Base* 형이며 그의 동적Derived* 인 다형성 포인터 타입이다.가상 소멸자가없는 다형성 객체를 삭제하면 어떻게됩니까? 다음 예에서

struct Base 
{ 
    virtual void f(); 
}; 

struct Derived : Base 
{ 

}; 

int main() 
{ 
    Base *b = new Derived(); 
    // ... 
    delete b; 
} 

가상 소멸자없이 b을 삭제하면 어떻게됩니까?

+0

https://www.securecoding.cert.org/confluence/display/cplusplus/OOP52-CPP.+Do+not+delete+a+polymorphic+object+without+a+virtual+destructor – v78

+0

가능한 [가상 다형성의 기본 클래스에 대한 가상 소멸자가 누락 된 = Ressource 누출?] (http://stackoverflow.com/questions/33455750/virtual-destructor-missing-for-base-class-in-polymorphism-ressource-leak) – stefaanv

답변

2

b가 가상 소멸자없이 삭제되면 어떻게됩니까?

잘 모르겠습니다. 동작은 정의되지 않습니다. 실제로 대부분의 경우 소멸자 Derived은 호출되지 않을 수도 있지만 아무 것도 보장되지 않습니다.

5.3.5 Delete [expr.delete]

(강조 광산) 첫번째 대안 (개체를 삭제)에서

, 삭제할 오브젝트의 정적 유형이 동적 유형과 다른 경우, 정적 형 이 삭제되고 인 동적 유형의 기본 클래스가되어야하며 정적 유형에는 가상 소멸자가 있거나 동작은 정의되지 않음입니다. 이

delete b; 

대상 컴파일러에서 일반적인 경우에 의존 사실

+2

@downvoter 내가 잘못했기 때문에 내가 그것을 향상시킬 수 있는지 말해줘. – songyuanyao

0

B는 다음 프리 할당 된 메모리 유형에 대한 descructor 함수 호출이다. 따라서 소멸자가 가상이고 가상 테이블 (~ Derived)에서 함수라고 부르지 만 클래스 (~ Base)에서 함수가 호출되지 않으면 함수가 호출됩니다. 예상 결과 : ~ 자료 만 호출됩니다.