TN017: 창 개체 소멸
이 메모를 사용 하는 설명에 CWnd::PostNcDestroy 메서드.사용자 지정 된 할당을 수행 하려는 경우이 메서드를 사용 합니다. CWnd-파생 개체입니다.이 참고를 사용 해야 하는 이유 또한 설명 CWnd::DestroyWindow 대신에 Windows C++ 개체를 소멸 하는 delete 연산자.
이 항목에 있는 지침을 따를 경우 약간의 문제가 정리 해야 합니다.C + +와 같은 시스템 리소스를 확보 하려면 잊어 메모리를 삭제 약속을 잊어 같은 문제에서 이러한 문제가 발생할 수 있습니다 HWNDs, 개체를 너무 여러 번 해제 합니다.
문제
각 windows 개체 (파생 클래스의 개체에서 CWnd)는 C++ 개체를 나타내는 및 HWND.C + + 개체에는 응용 프로그램의 힙 할당 되 고 HWNDs 창 관리자가 시스템 리소스에 할당 됩니다.여러 가지 방법으로 창 개체를 소멸 하기 때문에 우리가 시스템을 방지 하는 규칙 집합이 제공 해야 리소스나 메모리 누수.이러한 규칙 또한 개체 및 Windows 핸들 두 번 이상 파괴 되지 않도록 해야 합니다.
Windows를 파괴합니다.
Windows 개체를 소멸 시킵니다 허용 된 두 가지 방법으로 다음과 같습니다.
호출 CWnd::DestroyWindow 또는 Windows API DestroyWindow.
명시적으로 삭제 하는 delete 연산자입니다.
첫 번째 경우는 단연 가장 일반적입니다.이 경우 코드에서 호출 하지 않은 경우에 적용 하 DestroyWindow 직접.사용자가 직접 프레임 창을 닫으면이 작업 생성은 WM_CLOSE 기본이이 메시지에 응답 하 고 메시지를 호출 하는 것입니다 DestroyWindow. 부모 창이 소멸 될 때 Windows를 호출 DestroyWindow 모든 자식에 대 한.
두 번째 경우, 사용은 delete Windows 개체, 연산자 드문 있어야 합니다.다음은 경우에 따라 사용 하는 delete 은 올바른 선택입니다.
Cwnd::postncdestroy로 자동 정리
시스템에 Windows 창을 소멸 시킵니다 마지막 Windows 메시지 창으로 보낼 때 WM_NCDESTROY.기본 CWnd 메시지 처리기입니다 CWnd::OnNcDestroy.OnNcDestroy분리 되는 HWND 에서 C++ 개체 및 가상 함수를 호출 합니다. PostNcDestroy.일부 클래스는 C++ 개체를 삭제 하려면이 함수를 재정의 합니다.
기본 구현은 CWnd::PostNcDestroy 아무것도 스택 프레임에 할당 되거나 다른 개체에 포함 된 window 개체에 적합 하지.이 없이 다른 개체 힙에 할당할 수 있도록 설계 된 window 개체에 대 한 적절 한입니다.즉, 다른 C++ 개체에 포함 되어 있지 않은 창 개체에 대 한 적절 한입니다.
힙에 할당 수는 단독으로 사용 하도록 설계 된이 클래스를 재정의 하 여 PostNcDestroy 메서드를 수행 하는 delete this.이 문은 C++ 개체와 연관 된 메모리를 해제 합니다.경우에 기본 CWnd 소멸자가 호출 DestroyWindow 경우 m_hWnd 입니다 분리 및 NULL 핸들 정리 단계 될 때문에 NULL이 무한 재귀가 발생 하지 않습니다.
[!참고]
일반적으로 시스템 호출 CWnd::PostNcDestroy 창을 처리 후 WM_NCDESTROY 메시지와 HWND 및 C++ 창 개체는 더 이상 연결 합니다.시스템도 호출 합니다 CWnd::PostNcDestroy 대부분의 구현에서 CWnd::Create 오류가 발생 하면 호출 됩니다.자동 정리 규칙은이 항목의 뒷부분에 설명 되어 있습니다.
자동 정리 클래스
다음 클래스는 자동 정리에 대 한 설계 되지 않았습니다.일반적으로 다른 C++ 개체 또는 스택에 포함 되어 있습니다.
모든 표준 Windows 컨트롤 (CStatic, CEdit, CListBox등).
모든 자식 창에서 직접 파생 CWnd (예를 들어, 사용자 정의 컨트롤)입니다.
분할 창 (CSplitterWnd).
기본 컨트롤 막대 (파생 클래스에서 CControlBar를 참조 하십시오 기술 참고 31 컨트롤 막대 개체에 대 한 자동 삭제를 사용).
대화 상자 (CDialog)의 스택 프레임에서 모달 대화 상자에 대 한 설계.
모든 표준 대화 상자를 제외 하 고 CFindReplaceDialog.
클래스 마법사에서 만든 기본 대화 상자입니다.
다음 클래스는 자동 정리에 대 한 설계 되었습니다.이들은 일반적으로 스스로 힙에 할당 됩니다.
주 프레임 창 (직접 또는 간접적으로 파생 CFrameWnd).
Windows 보기 (직접 또는 간접적으로 파생 CView).
이러한 규칙을 중단 하려는 경우 재정의 해야는 PostNcDestroy 메서드를 파생된 클래스에 있습니다.자동 정리를 클래스에 추가 하려면 기본 클래스를 호출 하 고 다음 실행 한 delete this.자동 정리 클래스에서 제거 하려면 호출 CWnd::PostNcDestroy 대신 직접는 PostNcDestroy 를 직접 기본 클래스의 메서드.
자동 정리 동작 변경 주로 사용 힙에 할당할 수 있는 모덜리스 대화 상자를 만드는 것입니다.
호출 삭제 하는 경우
호출 하는 것이 좋습니다 DestroyWindow C++ 메서드 또는 전역 Windows 개체를 소멸 시킵니다 DestroyWindow API입니다.
전역 호출 하지 DestroyWindow API는 MDI 자식 창을 소멸 시킵니다.가상 메서드를 사용 해야 하면 CWnd::DestroyWindow 대신.
자동 정리 수행 하지 않는 C++ 창 개체를 사용 하는 delete 연산자를 호출 하면 메모리 누수가 발생할 수 있습니다 DestroyWindow 에 있는 CWnd::~CWnd 소멸자는 VTBL 제대로 파생된 클래스를 가리키지 않는 경우.이 메서드를 호출 하 여 적절 한 파괴 시스템을 찾을 수 없습니다 때문입니다.사용 하 여 DestroyWindow 대신 delete 이러한 문제를 피할 수 있습니다.한 미세한 수 있습니다 있으므로 디버그 모드에서 컴파일하면 위험이 있는 경우 다음과 같은 경고가 생성 됩니다.
Warning: calling DestroyWindow in CWnd::~CWnd
OnDestroy or PostNcDestroy in derived class will not be called
자동 정리를 수행 하려면 Windows C++ 개체의 경우, 호출 해야 DestroyWindow.사용 하는 경우는 delete 연산자 직접 MFC 진단 메모리 할당자는 알림 하면 메모리를 두 번 해제 됩니다.두 개를 첫 번째 명시적으로 호출 되어 간접 호출을 delete this 자동 정리 구현에서 PostNcDestroy.
호출 DestroyWindow 는 자동 정리 되지 않은 개체에서는 C++ 개체 주위를 계속 수 있습니다 있지만 m_hWnd NULL이 됩니다.호출 DestroyWindow 자동 정리 개체에, C++ 개체 해제 자동 정리 구현에서는 C++ delete 연산자가 사라지게 됩니다 PostNcDestroy.