본문 바로가기
IT/c++

C++ 가상소멸자: 안전하고 효율적인 객체 소멸

by 뉴코딩맨 2023. 8. 7.
C++ 프로그래밍에서 가상소멸자는 객체의 안전한 소멸과 메모리 관리를 위해 중요한 역할을 수행합니다. C++ 가상소멸자의 개념과 활용법을 살펴보겠습니다.
 
 

1. 가상소멸자란 무엇인가?

가상소멸자는 기반 클래스에서 선언되며 파생 클래스에서 오버라이딩될 수 있는 소멸자입니다. 객체가 파괴될 때 호출되어 필요한 정리 작업을 수행합니다.
 

2. 가상소멸자의 필요성

가상소멸자를 사용하지 않으면 파생 클래스의 객체가 기반 클래스로 소멸될 때 기반 클래스의 소멸자만 호출되고 파생 클래스의 소멸자가 호출되지 않아 메모리 누수 및 예기치 않은 동작이 발생할 수 있습니다.
 

3. 가상소멸자와 다형성

가상소멸자는 다형성을 지원하여 객체를 가리키는 포인터의 실제 타입에 따라 적절한 파생 클래스의 소멸자가 호출됩니다.
 

4. 가상소멸자의 동작 원리

가상소멸자는 가상함수 테이블(Virtual Function Table)을 통해 런타임에 적절한 파생 클래스의 소멸자를 호출합니다.
 

5. 가상소멸자와 상속

파생 클래스에서 가상소멸자를 오버라이딩하지 않으면 기반 클래스의 가상소멸자가 호출되므로 파생 클래스의 자원이 제대로 정리되지 않을 수 있습니다.
 

6. 가상소멸자의 사용법

 

 

가상소멸자는 기반 클래스의 소멸자를 가상 함수로 선언하고 "= default"로 정의하여 사용합니다.
 
class Base {
public:
    virtual ~Base() = default;
};

class Derived : public Base {
public:
    ~Derived() override {
        // 파생 클래스의 정리 작업
    }
};

 

 

7. 가상소멸자의 장점

  • 객체의 안전한 소멸과 메모리 관리를 보장합니다.
  • 다형성을 통해 올바른 파생 클래스의 소멸자가 호출되어 메모리 누수를 방지합니다.

8. 가상소멸자의 주의사항

  • 기반 클래스의 소멸자는 가상 함수로 선언되어야 하며 파생 클래스의 소멸자도 override되어야 합니다.
  • 가상소멸자는 반드시 선언부에만 "= default"를 사용하고 정의는 파생 클래스에서 해야 합니다.

9. 가상소멸자 예시 코드

class Shape {
public:
    virtual ~Shape() = default;
};

class Circle : public Shape {
public:
    ~Circle() override {
        // Circle 클래스의 정리 작업
    }
};
 

 

10. 가상소멸자의 용도

가상소멸자를 사용하여 기반 클래스와 파생 클래스의 안전한 소멸을 보장하고 메모리 관리를 개선할 수 있습니다.
 

댓글