소멸자(Destructor)는 객체가 소멸할 때 자동으로 호출되는 함수다.
소멸자는 생성자와 마찬가지로 정의할 때 void
를 따로 붙여주지 않는다. 또한 소멸자의 이름은 생성자의 이름 앞에 ~
만 붙여주면 되고 인수는 따로 없다.
#include <iostream>
using namespace std;
class Test {
private:
char c;
char* name;
public:
Test(char ch, const char* t_name) // 생성자
{
c = ch;
name = new char[strlen(t_name) + 1];
strcpy(name, t_name);
cout << "Calling Constructor " << c << " " << name << endl;
}
~Test() // 소멸자
{
delete[] name;
cout << "Calling Destructor " << c << endl;
}
};
void example() { Test b('b', "name is b"); }
int main() {
Test a('a', "name is a");
example();
Test* c = new Test('c', "name is c"); // 동적 할당
delete c;
}
Calling Constructor a name is a
Calling Constructor b name is b
Calling Destructor b
Calling Constructor c name is c
Calling Destructor c
Calling Destructor a
예시와 같이 객체가 소멸될 때 소멸자가 호출되어 실행된다.
example
함수의 지역 객체인 b
는 함수가 실행된 후에 소멸되기 때문에 main
함수의 지역 객체인 a
보다 먼저 소멸된다. 그리고 이후에 동적으로 할당한 객체 c
또한 main
함수가 끝나기 전에 명시적으로 해제했으므로 a
보다 먼저 소멸된다.
클래스 내부에서 동적으로 할당되었을 경우 delete
, 배열이 동적으로 할당되었을 경우 delete[]
를 소멸자 안에 작성해야 메모리 누수가 일어나지 않는다.