ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Effective C++...6
    일지 2022. 6. 4. 08:41

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

    기본 클래스의 소멸자가 가상 소멸자가 아닐 때의 문제

    파생 클래스 객체가 삭제될 때 기본 클래스에 비가상 소멸자가 들어 있으면 파생 클래스의 소멸자가 호출되지 않는다.

    즉, 기본 클래스가 가상 소멸자가 아닌 경우 파생 클래스가 정상적으로 제거되지 않는다.

     

    ※ 가상 함수를 하나라도 가진다면 소멸자를 가상 소멸자로 선언해야 한다.

     

    모든 클래스에 가상 소멸자를 넣는 것은 다른 문제

    가상 함수가 하나라도 있다면 vptr이라는 가상 함수 포인터가 생성되어 클래스의 크기가 커지게 된다.


    // 비가상 소멸자를 가진 Point 클래스, 크기는 64bit

    class Point {

    public:

        Point(int xCoord, int yCoord);

        ~Point();

    private:

        int x, int y;

    }

     

    // 가상 소멸자를 가진 Point 클래스, 크기는 32bit 아키텍처에서 96bit, 64bit 아키텍처에서 128bit

    class Point {

    public:

        Point(int xCoord, int yCoord);

        virtual ~Point();

    private:

        int x, int y;

    }


     

    ※ 상속받는 클래스에 가상 소멸자가 적용되었는지 확인하자.

     

    댓글

Designed by Tistory.