최대 1 분 소요

소멸자

생성자가 객체 자체의 초기화외에 외부 환경까지 초기화하기 때문에 객체가 사라질 때 반대의 처리를 할 함수도 필요하다. 객체나 메모리 또는 프로그램 등 컴퓨터안엫서 움직이는 모든것들은 항상 자신이 생성되기 전의 상태로 환경을 돌려 놓을 의무가 있다. 객체가 통신을 위해 네트워크 연결을 했다면 자신이 사라질 때 이 연결을 끊어야 하며 할당된 메모리는 해제해야 하는 것이다. 이러한 뒷처리를 히는 특별한 멤버 함수를 소멸자(Destructor)라고 하며 객체가 소멸될 때 컴파일러에 의해 자동으로 호출된다. 파괴자의 이름은 클래스 이름앞에 ~를(tidle) 붙인 것으로 고정되어 있으며 인수와 리턴 값은 가지지 않는다.

class Person
{
private:
    char *name;
    int age;

public:
    Person(const char *aName, int aAge) 
    {
        name = new char[strlen(aName) + 1];
        strcpy(name, aName);
        age = aAge;
    }

    ~Person()
    {
        delete [] name;
    }

    void OutPerson() 
    {
        printf("이름 : %s 나이 : %d\n", name, age);
    }
};
 
void main()
{
     Person Boy("을지문덕", 25);
     Boy.OutPerson();
}

생성자에서 별도의 버퍼를 직접 할당했으므로 name이 가리키는 버퍼는 외부의 힙에 따로 존재한다. Boy 객체는 main 함수의 지역변수이므로 main이 종료될 때 파괴되는데 이때 name멤버와 age 멤버가 차지하고 있는 8바이트가 해제될 것이다. 하지만 name이 가리키고 있는 힙의 메모리는 동적으로 할당된 것이므로 자동으로 해제되지 않는다. 그래서 객체가 파괴될 때 반드시 직접 해제해야 하며 이런 처리를 하는 함수가 파괴자이다.