티스토리 뷰

728x90
다형성을 가진 기본 클래스에서 가상 소멸자 사용하기

다형성을 가진 기본 클래스에서는 반드시 가상 소멸자를 선언하자

C++에서는 다형성을 가진 기본 클래스의 경우, 소멸자를 반드시 가상 소멸자로 선언해야 합니다. 그렇지 않으면, 기본 클래스 포인터를 통해 파생 클래스 객체를 삭제할 때 파생 클래스의 소멸자가 호출되지 않아 메모리 누수불완전한 소멸 문제가 발생할 수 있습니다.

기본 클래스의 비가상 소멸자를 사용할 경우, C++ 표준에 따르면 기본 클래스 포인터를 통해 파생 클래스 객체를 삭제하는 것은 미정의 동작이 됩니다.


예제 1: 비가상 소멸자의 문제점


class TimeKeeper
{
public:
    TimeKeeper();
    ~TimeKeeper(); // 비가상 소멸자
};

int main()
{
    TimeKeeper* ptk = getTimeKeeper();
    delete ptk;  // 비가상 소멸자가 호출됨
}

getTimeKeeper 함수에서 반환된 AtomicClock 객체가 TimeKeeper 기본 클래스 포인터로 삭제되면, AtomicClock 클래스의 소멸자가 호출되지 않고, AtomicClock의 멤버 데이터는 제대로 소멸되지 않습니다. 결과적으로 반쪽짜리 소멸이 이루어지게 됩니다.


해결책: 가상 소멸자를 사용하자

기본 클래스에 가상 소멸자를 선언하면, 기본 클래스 포인터를 통해 삭제할 때도 파생 클래스의 소멸자가 호출되며, 객체 전체가 올바르게 소멸됩니다.

예제 2: 가상 소멸자의 사용


class TimeKeeper
{
public:
    TimeKeeper();
    virtual ~TimeKeeper(); // 가상 소멸자
};

int main()
{
    TimeKeeper* ptk = getTimeKeeper();
    delete ptk;  // 가상 소멸자가 호출되어 파생 클래스까지 모두 소멸
}

여기서 virtual 키워드를 추가함으로써 파생 클래스의 소멸자가 호출되고, 파생 클래스의 멤버까지 올바르게 소멸됩니다. 이는 다형성을 가진 클래스를 설계할 때 매우 중요한 부분입니다.


가상 소멸자와 가상 함수의 관계

다형성을 지원하는 클래스는 대개 여러 가상 함수들을 포함하고 있습니다. 예를 들어, TimeKeeper 클래스는 현재 시각을 알려주는 가상 함수 getCurrentTime을 가질 수 있으며, 이를 파생 클래스에서 구체적으로 구현할 수 있습니다.

다형성을 가진 클래스라면 소멸자도 가상 소멸자로 선언하는 것이 일반적입니다. 가상 함수를 하나라도 가진 클래스라면, 해당 클래스의 소멸자는 반드시 가상 소멸자여야 합니다.


추상 클래스와 순수 가상 소멸자

추상 클래스는 주로 기본 클래스로 사용될 목적으로 만들어지며, 이 경우에도 가상 소멸자가 필요합니다. 추상 클래스는 순수 가상 함수를 포함하고 있으며, 순수 가상 소멸자를 선언하여 해당 클래스가 기본 클래스로 사용될 때 안전하게 소멸되도록 해야 합니다.

예제 3: 순수 가상 소멸자


class AbstractClass
{
public:
    virtual ~AbstractClass() = 0;  // 순수 가상 소멸자
};

AbstractClass::~AbstractClass() { }

위와 같이 순수 가상 소멸자를 선언하고 정의할 수 있습니다. 이는 추상 클래스에서 객체가 안전하게 소멸되도록 보장해줍니다.


결론

  • 다형성을 가진 기본 클래스에는 가상 소멸자를 반드시 선언해야 합니다.
  • 가상 함수가 하나라도 있는 클래스는 그 소멸자 역시 가상 소멸자로 선언해야 합니다.
  • 기본 클래스로 설계되지 않은 클래스나 다형성을 제공할 필요가 없는 클래스에서는 가상 소멸자를 선언하지 않아도 됩니다.
  • 추상 클래스의 경우, 순수 가상 소멸자를 사용하여 기본 클래스로서의 역할을 안전하게 수행할 수 있도록 설계해야 합니다.
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함
250x250