프로그래밍/cpp

c++ 생성자 소멸자/(virtual)가상 소멸자를 쓰는 이유

콘파냐 2014. 4. 21. 10:41
반응형

생성자와 소멸자 또는 파괴자라고도 한다. 생성자와 소멸자의 특성을 정리한다면 다음과 같다.

생성자는 클래스의 인스턴스를 메모리에 할당할 때 초기화의 방식을 담당한다. 반대로 소멸자는 클래스의 인스턴스가 더 이상 필요하지 않을 때 메모리에 존재하는 인스턴스를 해제를 위해 호출한다. new로 인스턴스를 동적할당 할때 생성자가 호출된다.  객체가 파괴될 때 소멸자는 자동으로 호출된다. 여기서 중요한 것은 객체의 파괴 뿐 아니라 객체가 생성될 당시 동적으로 할당된 환경들의 소거작업에 대한 정의가 소멸자에 정의(구현)되어야 한다. 생성자의 이름은 클래스의 이름과 동일하고 반환값이 없다. 반면에 소멸자의 이름은 클래스의 이름에 ~가 붙는다. 생성자와 소멸자는 클래스에 명시하지 않는 경우는 디폴트 생성자와 디폴트 소멸자가 사용된다. 

이외에도 클래스의 상속관계가 있을 경우 객체의 생성시 생성자와 소멸자의 동작특성이 있다.


2013/05/09 - [프로그래밍/c++] - 생성자와 소멸자 호출 C++


위에서 생성자와 소멸자에대한 기본적인 사항이다.



이제 실수하기 쉬운 부분에 대한 내용이다.

예를 들어 보겠다. A클래스를 B클래스가 상속받고 B클래스 객체를 생성할 때 생성자의 호출 순서는 다음과 같다.

A::A()

B::B()

상속단계 순서로 차례대로 생성자가 호출된다.

반면에 객체의 인스턴스가 해제될 때 소멸자의 호출은 생성자의 경우와 반대가 된다.

B::~B()

A::~A()

대략 여기까지 이해하기 쉬운 내용이다. 여러 말보다 한번의 코딩으로.... 다음 코드를 봐주시고 결과를 예상해 보자.




예상한 결과인가?

예상한 결과라면 ~B()도 호출이 되어야 한다. instance로만 접근할 수 있는 B인스턴스를 직접 해제시킬 수도 없는 노릇이다. instance를 통해서 해제를 해야하는데 예상밖으로 해제되지 않았다. B인스턴스는 아직도 메모리에 존재를 한다.

이를 해결하기 위한 방법은 간단하다. 소멸자를 virtual로 선언하면 된다.


2013/06/04 - [프로그래밍/c++] - 가상함수 virtual 키워드 C++


2014/01/04 - [프로그래밍/c++] - 가상함수(virtual),vptr,vtable C++


2014/01/07 - [프로그래밍/c++] - 가상함수(2)


이 문제는 virtual에 대한 특성을 잘 파악하면 쉽게 해결된다. virtual은 동적결합을 위한 키워드기 때문이다.

반응형