스마트 포인터를 사용했을 때 소멸자의 필요성

김민수·2025년 1월 8일

C++

목록 보기
34/68

스마트 포인터는 C++에서 메모리 관리를 자동화하기 위해 제공되는 클래스 템플릿으로, 객체의 생명 주기를 관리하고 메모리 누수를 방지해주기 때문에 대부분의 경우 명시적으로 소멸자를 선언하지 않아도 되지만 스마트 포인터 사용여부와 상관없이, 클래스의 특성에 따라 소멸자가 필요한 경우가 있다.


1. 스마트 포인터 사용 시 소멸자가 필요 없는 경우

  • 스마트 포인터는 객체가 더 이상 사용되지 않을 때 자동으로 메모리를 해제함
  • 클래스 내부에서 별도의 동적 자원 관리가 필요하지 않다면 소멸자를 명시적으로 선언하지 않아도 됨
class Dog {
public:
    void bark() { cout << "멍멍!" << endl; }
};

int main() {
    unique_ptr<Dog> dog = make_unique<Dog>();
    dog->bark(); // 스마트 포인터가 Dog 객체의 생명 주기를 관리
    return 0;    // 프로그램 종료 시 Dog 객체 메모리 자동 해제
}


2. 스마트 포인터 사용 시 소멸자가 필요한 경우

  • 스마트 포인터는 클래스 외부에서 생성된 객체의 생명 주기를 관리하지만, 클래스 내부에서 할당된 자원(예: new, malloc으로 생성된 메모리, 파일 핸들, 네트워크 연결 등)을 자동으로 관리하지는 않음
  • 따라서 클래스 내부 자원을 정리하는 소멸자가 필요함
class Dog {
    int* data;
public:
    Dog() { data = new int[10]; }
    ~Dog() {
        delete[] data; // 동적 메모리를 해제
        cout << "Dog 소멸" << endl;
    }
    void bark() { cout << "멍멍!" << endl; }
};

int main() {
    unique_ptr<Dog> dog = make_unique<Dog>();
    dog->bark(); // 스마트 포인터가 Dog 객체의 생명 주기를 관리
    return 0;    // Dog 소멸자가 호출되며 동적 메모리도 해제됨
}
  • Dog 클래스는 내부적으로 new로 할당한 메모리를 관리함
  • 소멸자가 없으면 data 배열이 해제되지 않아 메모리 누수가 발생함
  • 스마트 포인터는 Dog 객체의 생명 주기를 관리하지만, 내부 자원(data)은 관리하지 않으므로 소멸자가 필요함
profile
안녕하세요

0개의 댓글