effective C++을 보다가 질문입니다.
글쓴이: danguria / 작성시간: 목, 2010/01/28 - 1:54오후
항목 7을 보면 Base클래스의 소멸자에 virtual을 붙일 경우는 virtual함수가 있을경우, 즉 다형성을 이용할때
소멸자에 virtual을 붙이라고 하던데요..
다음과 같은 코드인 경우는 다형성을 이용하지 않지만 소멸자에 virtual을 붙여야 할 것 같은데 고수님들의 의견을 구합니다.
#include <iostream> using namespace std; class Base{ private: int *a; public: Base(){ a = new int(2); } ~Base(); }; Base::~Base(){ printf("dest - base\n"); delete a; } class Derived : public Base{ private: double *d; public: Derived(){ d = new double(2.2); } ~Derived(); }; Derived::~Derived(){ printf("dest - derived\n"); delete d; } int main(){ Base b; return 0; }
Forums:
Base의 소멸자가
Base의 소멸자가 virtual이 아니라면 아래와 같은 코드를 사용했을 때 Derived의 소멸자가 호출되지 않게 됩니다.
boost::noncopyable 과 같이 상위 클래스로 upcasting한 후 Delete를 하는 일이 없을 것이라 확신할 때에는 소멸자를 virtual로 선언하지 않아도 됩니다.
다형성이고 뭐든간에
다형성이고 뭐든간에 소멸자에서 반드시 뭔가를 해야하고 반드시 소멸자가 호출되어야 한다면 소멸자를 버추얼로 해야합니다.
이렇게 이해하시면 굳이 다형성->버추얼 로 생각하지 않으셔도 됩니다.(사실 예제로 들어주신게 다형성 기능입니다.)
위와 같이 반드시 소멸자가 호출되어야지만 하는 메모리 해제와 같은 행동이 들어 있으면 버추얼로 해주시면 됩니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
소멸자는 무조건...
소멸자는 무조건 virtual 로 하시는게 속 편합니다.
kukyakya 님이 드신 예 때문이죠.. 라이브러리의 사용자가 어떻게 쓸지는 통제 불가입니다.
댓글 달기