2017-02-18 23 views
0

명백히 이유없이 오류 종료시 때때로 충돌하는 MFC C++ 프로그램이 있습니다. 내 구체적인 쿼리는 다음과 같습니다 :Untidy 프로그램 종료 : MFC C++

내 InitInstance()의 오버로드에는 이벤트 및 세마포와 같은 리소스를 설정할뿐 아니라 다양한 검사가 있습니다. 사용자가 정상적인 종료를 요청하면 리소스를 해제하는 것을 포함하여 모든 것을 닫는 OnDestroy() 메시지 핸들러가 있습니다.이 비트는 정상적으로 작동합니다.

이 문제는 InitInstance()의 검사 중 하나가 실패하고 함수가 값 0 (프로그램 종료 원인)을 반환 할 때 발생합니다. 내 질문은 이것입니다 : 그 사건에서 OnDestroy()는 자동으로 물건을 정리하기 위해 호출합니까, 아니면 InitInstance를 종료하기 전에 직접 실행해야합니까?

+0

왜 디버거에 묻지 않습니까? 'OnDestroy()'에 중단 점을 설정하고 무슨 일이 일어나는 지보십시오. 또한 프로세스가 "명백한 이유없이"* 충돌하지 않습니다. 이유는 Win32 예외가 발생할 때 중단되도록 디버거를 설정할 때 분명 해집니다. 무기력하지 마십시오. – IInspectable

+0

메인 프로그램을 초과하는 스레드 또는 뮤텍스가 있습니까? 주된 종료 후 닫히기로되어 있지만 수동으로 수정해야하는 MSVC 버그가 있습니다. – ark1974

+1

@ ark1974 : 컨트롤이 사용자 제공 엔트리 포인트 (GUI 프로그램에서'main'이 아니라'WinMain '이라고 부름)를 떠날 때, 그것은 정리가 수행되는지 여부와 상관없이 대부분 부적합합니다. 프로세스가 곧 종료되고 OS가 모든 리소스를 다시 확보합니다. 어떤 * "버그"*를 말하는지 확실하지 않습니다. – IInspectable

답변

0

주 창 창이 이미있는 경우 DestroyWindow를 사용하여 먼저 제거해야합니다. 그리고 아니요, InitInstance가 FALSE로 종료 될 때 자동으로 삭제되지 않습니다. ExitInstance가 실행되지만 응용 프로그램이 종료 될 때 기존 창은 닫힙니다.

아무튼 응용 프로그램이 존재할 때 파일과 메모리 같은 일반 리소스는 해제됩니다.

관련 문제