본문 바로가기

Library/Windows Programming

CWnd::PostNcDestroy()

일반적으로, 가장 바깥의 프레임 윈도우를 만드는데는 CFrameWnd가 사용되는데, 이것은 따로 청소 작업을 해주지 않아도 된다. 즉, CWinApp의 m_pMainWnd에 CFrameWnd에서 파생된 윈도우를 붙였다면, 이것은 따로 삭제해주지 않아도 CFrameWnd가 알아서 삭제된다.

그렇지만, 프레임 윈도우를 CFrameWnd가 아니라 CWnd에서 파생받아서 사용했고, 이것을 힙에 생성했다면, 청소 작업을 반드시 해주어야 한다. 2가지 방법이 있을 수 있는데, 가장 일반적인 방법인, PostNcDestroy() 메서드를 오버라이딩해서 자신을 삭제해주어야 한다. (delete this와 같은 방법으로)

두번째 방법은, 만약 PostNcDestroy() 메서드를 오버라이딩하지 않는다면 스마트 포인터와 같은 것을 사용해서 해당 영역을 빠져나갈 때 자동으로 자신을 삭제하도록 하는 것이다. 이 방법을 사용해서 Visual C++에서 컴파일한다면, Visual C++은 PostNcDestroy()를 재정의하지 않았다는 경고 메세지를 보여줄 것이다.

물론, 스마트 포인터로 감싼 CWnd에서 PostNcDestroy()를 오버라이딩했다면 CWnd은 소멸 시점에서 정의되지 않은 동작을 하게 된다. 스마트 포인터를 사용하지 않는다면 반드시 CWnd 개체는 PostNcDestroy()를 오버라이딩해서 청소 작업을 해야 한다.