delete를 사용해서 메모리 해제해줬을 때 소멸자가 있고 없고 차이

김민수·2025년 1월 8일

C++

목록 보기
33/68

1. delete의 역할

  1. 메모리 해제
    • delete는 동적으로 할당된 메모리를 힙에서 해제함
    • 이는 소멸자의 유무와 상관없이 이루어짐
  2. 소멸자 호출
    • 객체에 소멸자가 정의되어 있다면, delete가 호출될 때 소멸자가 먼저 실행됨
    • 소멸자가 실행된 이후에 메모리가 해제됨


2. 소멸자가 없는 경우의 문제

  • 소멸자가 없으면 클래스 내부에서 수행해야 할 정리 작업이 누락될 수 있음
  • 특히, 동적 자원(예: 동적 메모리, 파일 핸들, 네트워크 소켓 등)을 관리하는 클래스에서는 메모리 누수와 같은 문제가 발생함
class MyClass {
public:
    MyClass() {
        cout << "MyClass 생성" << endl;
        data = new int[10]; // 동적 메모리 할당
    }
    // 소멸자가 정의되지 않음
private:
    int* data;
};

int main() {
    MyClass* obj = new MyClass();
    delete obj; // 메모리 해제는 되지만 동적 배열은 해제되지 않음
    return 0;
}


3. 소멸자가 필요한 경우

1. 동적 자원 정리가 필요한 경우

  • 동적 메모리, 파일 핸들, 네트워크 연결 등 수동 정리 작업이 필요하다면 소멸자가 반드시 필요함
  • 소멸자가 없다면 이러한 자원은 해제되지 않아 시스템 자원이 낭비됨
class MyClass {
public:
    MyClass() {
        cout << "MyClass 생성" << endl;
        data = new int[10]; // 동적 메모리 할당
    }
    ~MyClass() {
        delete[] data; // 동적 배열 해제
        cout << "MyClass 소멸" << endl;
    }
private:
    int* data;
};

int main() {
    MyClass* obj = new MyClass();
    delete obj; // 소멸자가 호출되어 자원이 정리됨
    return 0;
}

2. 다형성을 사용하는 경우

  • 다형성을 사용하는 클래스에서는 반드시 가상 소멸자가 필요함
  • 이를 통해 파생 클래스의 소멸자를 올바르게 호출할 수 있음
class Base {
public:
    virtual ~Base() {
        cout << "Base 소멸" << endl;
    }
};

class Derived : public Base {
public:
    ~Derived() {
        cout << "Derived 소멸" << endl;
    }
};

int main() {
    Base* obj = new Derived();
    delete obj; // Derived와 Base의 소멸자가 순서대로 호출됨
    return 0;
}
profile
안녕하세요

0개의 댓글