2009-08-22 6 views
12

기본 클래스 A와 파생 클래스 B가 있습니다.내 소멸자가 왜 부르지 않았습니까?

class A 
{ 
public: 
    virtual f(); 
}; 

class B : public A 
{ 
public: 
    B() 
    { 
     p = new char [100]; 
    } 
    ~B() 
    { 
     delete [] p; 
    } 
    f(); 
private: 
    char *p; 
}; 

어떤 이유로 든 소멸자는 호출되지 않습니다 - 왜? 나는 이것을 이해하지 못한다.

+1

모두가 이미 문제가 무엇인지 알아 냈지만 (C++의 FAQ이므로) 클래스 B 사용 방법을 코드에 표시해야합니다. (이 방법을 사용하는 경우 : B * p = new B(); p를 삭제하고 소멸자가 호출되지 않았다면 전혀 다른 문제가됩니다.) –

답변

35

기본 클래스에는 가상 소멸자가 필요합니다. 그렇지 않으면 A * 유형의 포인터 만 사용되는 경우 파생 클래스의 소멸자가 호출되지 않습니다. '당신의 변수가 A 형의 경우는 가상 소멸자가없는

class A 
{ 
public: 
    virtual ~A() {} 
    virtual f(); 
}; 

class B : public A 
{ 
public: 
    B() 
    { 
     p = new char [100]; 
    } 
    virtual ~B() // virtual keywork optional but occasionally helpful for self documentation. 
    { 
     delete [] p; 
    } 
    f(); 
private: 
    char *p; 
}; 
+0

에 대한 포인터를 통해 호출되면 호출되지 않습니다.이 가상 소멸자를 사용하지 않는 이유가 있습니다 주 수업? – sluki

7

클래스 A에는 가상 소멸자가 있어야합니다. 이것이 없으면 클래스 소멸자가 파생되지 않습니다.

+2

소멸자가 A. –

3

이 시도 객체의 실제 런타임 유형을 확인하여 해당 객체를 호출해야합니다.

A

가상 ~ A() {}

에 빈 소멸자 dd는 그 그것을 수정해야합니다.

일반적으로 기본 클래스로 사용할 수있는 모든 클래스에서이 작업을 수행해야합니다.

3

을하고 그래서 원 :

클래스 A에

virtual ~A() {}; 

추가

관련 문제