티스토리 뷰

프로그래밍/잡탕

release (delete this)에 대한 고찰

터프 프로그래머 2012. 1. 14. 22:06
갑자기 궁금해진 것이 있었다.

A 클래스에 virtual release() 함수를 만들고 그 안에서 delete this를 한다.
그리고 B 클래스에서 A 클래스를 상속 받고 release() 함수를 오버라이딩 하지 않는다.
그 다음 B 클래스의 객체로 release() 함수를 호출하면
과연 B 클래스를 전체를 지울 것인가(A 포함), B 클래스의 A 클래스 부분만 지울 것인가가 헷갈렸다.
본능적으로 당연히 전자가 답이라고 생각이 들었지만 확실한지 궁금해졌다.

#include <stdio.h>


class A

{

char *a;


public:

A() { a = new char[10]; };

virtual ~A() { delete []a; };


void release()

{

if( true )

delete this;

}


void Print() 

{

printf("%s\n", a);

};

};


class B : public A

{

char *b;

public:

B() { b = new char[20]; };

virtual ~B() { delete []b; };


virtual void Print() 

{

A::Print();


printf("%s\n", b);

};


};


void main()

{

A * ca = new A;

B * cb = new B;


ca->Print();

ca->release();


cb->Print();

cb->release();

}

 

디버거를 돌려보면 알 수 있는데 결론적으로 B의 객체 cb에서 release()를 호출하면 B 전체가 delete 된다.
확실하진 않으나 A 클래스에서 release() 함수가 virtual이기 때문에 자식 클래스에 함수 자체가 그대로 복사가 되어서  
결국엔 delete this(B)가 되는 것이 아닌가 싶다. 
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday