이 노트 CWnd::PostNcDestroy 멤버 함수를 사용 하 여를 설명 합니다. CWnd의 사용자 할당을 수행 하고자 하는 경우이 함수를 사용 하 여-파생 개체。
이 노트는 또한 일부 추기경 규칙에 대 한 이유를 설명합니다.:
C + + 창 개체를 파괴 하려면 DestroyWindow 하지 "삭제"。
이것은 중요 하다입니다. 아래의 지침을 따라 해야 몇 가지 정리 문제 (예: 삭제/무료 c + + 메모리를 잊고, 잊고 HWNDs와 같은 시스템 리소스를 해제 또는 개체를 너무 여러 번 해제)。
문제
Windows 개체 ( CWnd에서 파생 된 클래스의 개체) (응용 프로그램의 힙 할당) c + + 개체와 HWND (창 관리자가 시스템 리소스에 할당 된)를 나타냅니다. Window 개체를 파괴 하는 방법은 여러 가지, 이후 우리는 방지 시스템 리소스 또는 응용 프로그램 메모리 누수 및 번 이상 파괴 되 고에서 개체와 Windows 핸들을 방지 하는 규칙의 집합을 제공 해야 합니다.
이것은 이상 메모리 관리 문제입니다. 윈도우 창 존재 영향이 사용자 인터페이스: 화면;에 창 일단 그것을 파괴입니다 거기 또한 영향을 시스템 리소스에. 응용 프로그램 주소 공간에서 c + + 메모리 누수 시스템 리소스 누수 만큼 나쁘지 않다。
Windows를 파괴
Windows 개체를 파괴 하는 두 개의 허용 방법은:
첫 번째 경우는 지금까지 가장 일반적인. 이 경우에는 DestroyWindow 사용자 코드에서 직접 호출 하지 않은 경우에 적용 됩니다. 있는 경우 사용자가 직접 (기본 WM_CLOSE 동작 DestroyWindow를 호출 하는 것)는 프레임 창 닫으면 하 고 부모 창 소멸 되 면 Windows 모든 어린이 위한 DestroyWindow 를 호출。
두 번째의 경우, Windows 개체 삭제 연산자를 사용 하 여 매우 드문 있어야 하 고 경우에만 아래에 설명 된。
Cwnd::postncdestroy와 함께 자동 정리
때 Windows 창 파괴, 창으로 전송 하는 마지막 Windows 메시지 WM_NCDESTROY입니다. 기본 CWnd 처리기 메시지 (CWnd::OnNcDestroy)에 대 한 c + + 개체와 가상 PostNcDestroy함수 호출에서 HWND 를 분리 됩니다. C + + 개체를 삭제 하려면이 함수를 재정의 하는 일부 클래스。
CWnd::PostNcDestroy 의 기본 구현이 않습니다 아무것도 스택 프레임에 할당 된 또는 다른 개체에 포함 된 window 개체에 대 한 적절 한입니다. 이것은 힙 (다른 c + + 개체에는 포함 되지 않습니다)에 스스로 의해 할당 되는 window 개체에 대 한 적절 한。
스스로 의해 힙에 할당 될 하도록 설계 된 이러한 클래스는 "이 삭제"를 수행 하 PostNcDestroy 멤버 함수를 재정의. 이 문은 c + + 개체와 관련 된 모든 c + + 메모리를 무료로 됩니다. M_hWnd NULL이 아닌 경우 DestroyWindow 를 호출 하는 기본 CWnd 소멸자, 비록이 리드 하지 않습니다 무한 재귀가 때문에 정리 단계 분리 하 고 NULL 처리 될 것입니다.
메모nbsp;CWnd::PostNcDestroy Windows WM_NCDESTROY 후 라고 일반적으로 창 파괴의 일환으로 메시지 처리 및 c + + 창 개체와 HWND 이상 첨부 된. (자동 정리 규칙 아래 참조) 오류가 발생 하는 경우 대부분의 만들기 호출 구현에서 CWnd::PostNcDestroy 를 호출할 수도 것입니다(&N).
자동 정리 클래스
다음 클래스는 자동 정리를 위해 설계 되지 않았습니다. 그들은 일반적으로 다른 c + + 개체 또는 스택에 포함:
다음 클래스는 자동 정리를 위해 설계 되었습니다. 그들은 일반적으로 스스로 의해 힙에 할당 된:
이러한 규칙을 중단 하고자 하는 경우 파생된 클래스에서 PostNcDestroy 멤버 함수를 재정의 해야 합니다. 자동 정리를 클래스에 추가 하려면 단순히 기본 클래스를 호출 하 고 이 삭제를 수행. 클래스에서 자동 정리를 제거 하려면 직접 기본 클래스의 PostNcDestroy 멤버 대신에 직접 CWnd::PostNcDestroy 을 호출합니다。
위의의 가장 일반적인 사용은 힙에 할당할 수 있는 모덜리스 대화 상자를 만들려면。
전화 '삭제'를
Windows 개체를 파괴 하는 것이 좋습니다 c + + 멤버 함수 또는 전역 DestroyWindow를 하거나 호출 하는 것 :: DestroyWindow API。
글로벌 호출 하지 않습니다 :: DestroyWindow API를 파괴 하는 MDI 자식 창을 대신 가상 멤버 함수 CWnd::DestroyWindow 를 사용。
자동 정리를 수행 하지 않는 c + + 창 개체에 대 한 삭제 하는 대신 DestroyWindow 를 사용 하 여 문제가 발생 하지 않도록 DestroyWindow 호출 하는 데는 CWnd:: ~ CWnd 소멸자 어디 있는 VTBL 올바르게 파생된 클래스를 가리키지 않습니다. MFC의 진단 (디버그) 버전 당신을 경고할 것 이다 그래서이 미묘한 버그가 발생할 수 있습니다.
경고: 호출 DestroyWindow CWnd:: ~ CWnd
nbsp; OnDestroy 또는 PostNcDestroy 파생된 클래스에서 호출 되지 않습니다(&N).
자동 정리를 수행 하는 c + + 창 개체의 경우 DestroyWindow를 호출 해야 합니다. 를 사용 하면 연산자 삭제 직접 MFC 진단 메모리 할당자가 알려드립니다 메모리 두 번 ( 삭제 하려면 첫 번째 호출) 뿐만 아니라 "이 삭제" 자동 정리 구현에서 PostNcDestroy의 간접 호출을 자유롭게。
DestroyWindow 자동 정리 개체를 호출한 후 c + + 개체 주위에, 여전히 있을 것입니다 하지만 m_hWnd NULL이 됩니다. DestroyWindow 자동 정리 개체를 호출한 후 c + + 개체가 사라질 것 PostNcDestroy 자동 정리 구현에서 c + + delete 연산자에 의해 해제..
기술 노트 번호로 |nbsp; 카테고리별 기술 노트(&N)