언어 자료구조 알고리즘/Escort C++

[C++] 소멸자

언제나휴일 2016. 4. 15. 12:57
반응형

- 소멸자

 

 C++ Java C#과 달리 플랫폼에서 개체들을 관리(Managed)하지 않습니다. 물론, 여기서 얘기하는 C++ Native 기반의 C++을 얘기를 하는 것이며 .NET에서 개발하는 Managed C++을 얘기하는 것이 아닙니다. 플랫폼에서 관리하는 개체를 관리화(Managed) 개체라고 하는데 이들은 소멸에 관한 책임이 개발자에게 부여하지 않고 플랫폼이 해당 개체를 참조하는 변수가 있는지를 플랫폼이 조사합니다. 이러한 조사(세대 조사)를 통해 참조되지 않는 개체들은 플랫폼의 가비지 수집할 때 수집 대상이 되는 형태로 관리가 되기 때문에 개발자가 소멸에 관한 책임이 적습니다. 이들과 달리 C++에서는 생성되는 개체는 관리화 개체가 아니므로 개발자가 소멸에 관한 책임을 져야 합니다.

 

 소멸자도 생성자와 마찬가지로 사용자가 직접 호출하기 위해 작성하는 것이 아니라 delete 연산자를 사용하면 해당 형식의 소멸자 메서드가 가동이 됩니다. 만약, 사용자가 정의한 형식에 소멸자 메서드를 정의하지 않으면 디폴트 소멸자가 만들어지는데 여기에서는 자기 자신에게 할당한 메모리를 반납하는 작업을 수행합니다.

 

 그렇다면 어떨 때 사용자가 소멸자 메서드를 정의해야 할까요? 형식을 정의하다 보면 개체 내부에서 다른 개체를 동적으로 생성해서 관리하는 경우가 발생합니다. 이 같은 경우에 디폴트 소멸자에서는 내부에서 생성한 다른 개체를 소멸하지 않습니다. 만약, 사용자가 소멸자를 정의하지 않으면 내부에서 생성한 개체 때문에 메모리 누수가 생기게 됩니다. 이처럼 개체 내부에서 다른 개체를 동적으로 생성해서 관리하면 사용자가 소멸자 메서드를 정의하여 해당 개체를 소멸하는 코드를 작성하여 메모리 누수를 막는 것이 개발자의 책임입니다. 소멸자도 생성자처럼 리턴 형식은 개발자가 명시할 수 없게 되어 있으며 생성자와 다르게 중복 정의를 허용하지 않습니다. 

 

Head.h - Head 클래스 정의로 Animal에 포함될 형식

#pragma once

#include <iostream>

using std::cout;

using std::endl;

class Head

{

public:

    Head();

    virtual ~Head();

};

  

Head.cpp - Head 클래스 구현

#include "Head.h"

Head::Head(void)

{

    cout<<"Head 생성자"<<endl;

}

Head::~Head(void)

{

    cout<<"Head 소멸자"<<endl;

}

 

Animal.h - 내부에 Head형식의 개체를 위한 멤버 필드가 있음

#pragma once

#include "Head.h"

class Animal

{

    Head *head;

public:

    Animal(void);

    ~Animal(void);

};

 

Animal.cpp - Animal 생성자에서 동적으로 생성한 개체를 소멸자 메서드에서 소멸의 책임을 지고 있음

#include "Animal.h"

Animal::Animal(void)

{

    cout<<"Anmail 생성자"<<endl;

    head = new Head();

}

Animal::~Animal(void)

{

    delete head;

    cout<<"Animal 소멸자"<<endl;

}

 

Program.cpp - 데모

#include "Animal.h"

void main()

{

    Animal *animal = new Animal();

    delete animal;

}


생성과 소멸

[그림 2.8]

 

 개발자가 이처럼 소멸에 관한 책임을 지는 것은 좋은 습관을 갖고 있지 않으면 그냥 지나칠 수 있습니다. 프로그램에서 생성한 메모리에 대해 소멸을 하지 않는다고 해서 프로그램이 터지지는 않습니다. 하지만, 서버 프로그램처럼 상주하는 프로세스에서 개체의 생성은 하고 소멸을 하지 않는다면 메모리가 부족하게 되어 먹통이 될 수 있습니다.  개체를 생성하는 코드를 작성할 때 소멸에 대한 코드를 같이 작성하는 습관을 기르십시오.


2장 캡슐화 Part1 

2장 캡슐화 Part2 

(모든 동영상 강의는 무료입니다.)

반응형