[모던C++입문] 2.4 소멸자

    2.4 소멸자

    • 소멸자는 개체를 파괴할 때 마다 호출되는 함수

    구현 규칙

    • 소멸자에서 예외를 던지지 말라
    • noexcept로 암시적 선언되어 C++11이상에서는 항상 실행을 중단하는 런타임 오류로 처리
    • 클래스에 virtual 함수가 있으면 소멸자도 virtual이어야 한다

    리소스 제대로 처리하기

    • 개체가 메모리와 같은 리소스를 할당하는 경우 소멸자가 필요
    class vector
    {
    public:
        ~vector()
        {
            delete[] data;
        }
    
    private:
        unsigned my_size;
        double *data;
    }

    리소스 획득은 초기화

    • Resource Acquisition is Initialization (RAII)
    • 메모리 누수를 막기위해 모든 예외 발생시 마다 리소스를 해제를 수동으로 해야한다.
    • unique_ptr이나 shared_ptr을 통해 메모리 누수를 방지할 수 있다
    bool error() 
    {
        return true;
    }
    
    void func() 
    {
        int* c = new int[100];
        if (error()) return;    //error 또는 예외 발생
    
        delete[] c;             //해제하지 못한다
    }
    
    void func2()
    {
        std::unique_ptr<int> p(new int(100));
        if(error()) return;     //예외발생으로 함수를 빠져나가는순간 p는 해제 됨
    
        delete[] p;
    }
    반응형

    댓글

    Designed by JB FACTORY