C++/Class 2021. 3. 20. 17:45

가상 소멸자

  • virtual 키워드를 소멸자에도 붙일 수 있다.

예제

  • 가상 소멸자를 사용하지 않은 기본 예제

    #include <iostream>
    
    class Base
    {
    public:
      ~Base() { std::cout << "~Base()" << std::endl; }
    };
    
    class Derived : public Base
    {
      int *array_;
    
    public:
      Derived(const int& length)
      {
        array_ = new int[length];
      }
    
      ~Derived()
      {
        std::cout << "~Derived()" << std::endl;
        delete[] array_;
      }
    };
    
    int        main()
    {
      using namespace std;
    
      Derived    derived(5);
    }
    
    /* stdout
    ~Derived()
    ~Base()
    */

  • 메모리 누수 예제

    #include <iostream>
    
    class Base
    {
    public:
      ~Base() { std::cout << "~Base()" << std::endl; }
    };
    
    class Derived : public Base
    {
      int *array_;
    
    public:
      Derived(const int& length)
      {
        array_ = new int[length];
      }
    
      ~Derived()
      {
        std::cout << "~Derived()" << std::endl;
        delete[] array_;
      }
    };
    
    int        main()
    {
      using namespace std;
    
      Derived    *derived = new Derived(5);
      Base* base = derived;
    
      delete base;
    }
    
    /* stdout
    ~Base()
    */
  • 부모와 자식 클래스의 소멸자에 virtual 키워드를 붙이고, 자식 클래스의 소멸자에 override까지 붙여주면 좋다.

    #include <iostream>
    
    class Base
    {
    public:
      virtual ~Base() { std::cout << "~Base()" << std::endl; }
    };
    
    class Derived : public Base
    {
      int *array_;
    
    public:
      Derived(const int& length)
      {
        array_ = new int[length];
      }
    
      virtual ~Derived() override
      {
        std::cout << "~Derived()" << std::endl;
        delete[] array_;
      }
    };
    
    int        main()
    {
      using namespace std;
    
      Derived    *derived = new Derived(5);
      Base* base = derived;
    
      delete base;
    }
    
    /* stdout
    ~Derived()
    ~Base()
    */

'C++ > Class' 카테고리의 다른 글

C++ 동적 바인딩 (Dynamic Binding)  (0) 2021.03.20
C++ 정적 바인딩 (Static Binding)  (0) 2021.03.20
C++ 공변 반환형(Covariant Return Type)  (0) 2021.03.20
C++ Override, Final  (0) 2021.03.20
C++ 가상 함수와 다형성 (virtual)  (0) 2021.03.20