C++ 소멸자(destructor)와 free() 함수의 차이
C++에서 소멸자(destructor)와 free() 함수는 모두 객체나 메모리와 관련이 있어 비슷해 보이지만, 실제 역할과 동작 방식은 완전히 다릅니다. 이 글에서는 두 개념의 차이점을 예제 코드와 함께 자세히 살펴보겠습니다.
소멸자(destructor)란 무엇인가?
소멸자는 객체가 소멸되기 직전에 자동으로 호출되는 특수한 멤버 함수입니다. 소멸자에서 수행하는 작업이 반드시 메모리 해제일 필요는 없으며, 화면에 메시지를 출력하는 것처럼 단순한 동작일 수도 있습니다.
소멸자는 주로 다음과 같은 경우에 호출됩니다.
delete키워드로 객체를 명시적으로 삭제할 때- 객체가 선언된 범위(scope)를 벗어날 때
- 함수가 종료되어 지역 객체가 사라질 때
소멸자는 매개변수를 받지 않으며, 어떤 값도 반환하지 않는다는 특징이 있습니다.
free() 함수란 무엇인가?
free() 함수는 C 언어의 표준 라이브러리 함수로, malloc() 등으로 할당한 메모리를 해제하는 데 사용됩니다. C++에서도 호출할 수 있지만, 일반적으로는 같은 기능을 하는 delete 키워드를 사용하는 것이 권장됩니다.
예제 코드
다음 예제는 new로 생성한 객체를 delete로 삭제할 때 소멸자가 호출되는 과정을 보여줍니다.
#include<iostream>
#include<cstdlib>
using namespace std;
class MyClass {
public:
~MyClass() {
cout << "Destructor of MyClass" << endl;
}
};
int main() {
MyClass *obj;
obj = new MyClass();
delete obj;
return 0;
}
실행 결과
Destructor of MyClass
free()와 delete의 핵심 차이
free() 함수는 경우에 따라 소멸자를 호출하지 않은 채 단순히 메모리 공간만 해제할 수 있습니다. 반면 delete는 객체를 제거하기 전에 반드시 소멸자를 호출합니다. 그렇기 때문에 위 예제에서는 free() 대신 delete 키워드를 사용한 것입니다.
특히 new로 할당한 객체를 free()로 해제하면 소멸자가 실행되지 않아 리소스 누수나 정의되지 않은 동작(undefined behavior)이 발생할 수 있으므로 주의해야 합니다.
| 구분 | 소멸자(~ClassName) | free() |
|---|---|---|
| 종류 | C++ 클래스의 멤버 함수 | C 표준 라이브러리 함수 |
| 호출 방식 | 객체 소멸 시 자동 호출 | 프로그래머가 명시적으로 호출 |
| 소멸자 실행 | 해당 없음(자체가 소멸자) | 호출하지 않음 |
| 인자 · 반환값 | 인자 없음, 반환값 없음 | 포인터 1개 전달, 반환값 없음 |
마무리
정리하면, 소멸자는 객체가 사라지기 직전 필요한 정리 작업을 수행하는 C++의 특수 함수이고, free()는 단순히 메모리만 해제하는 C 라이브러리 함수입니다. C++에서 객체를 다룰 때는 free()보다 delete를 사용하는 것이 안전하며, 그 이유는 delete가 소멸자를 확실하게 호출해 주기 때문입니다.