1. delete의 역할
- 메모리 해제
- delete는 동적으로 할당된 메모리를 힙에서 해제함
- 이는 소멸자의 유무와 상관없이 이루어짐
- 소멸자 호출
- 객체에 소멸자가 정의되어 있다면, 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;
return 0;
}