Computer/C, CPP, MFC

프로그램 종료

hwaya. 2015. 10. 13. 10:22
반응형

프로그래밍을 하던중 어떻게 하면 안전하게 프로그램을 종료할까 생각해보았다.

바로 구글링


메모릭 발생 때문에..

문제들이 대부분 발생하는것으로 보여지더라..


아하! 그렇구나, 라고 다시 한번 느낀 후...


쓰던대로 그냥


 'ExitProcess


이거 사용하였다.


끝!





메인 다이얼로그::OnInitDialog()에서 프로그램을 종료하고 싶다.

OnClose나 기타 메소드가 먹지 않거나 먹어도 메모리 충돌 오류메시지가 나온다.

exit(0);를 넣어줘도 되나 비정상적인 terminated라 메모리 누수가 발생한다.


방법은 다음과 같다.


::SendMessage(this->m_hWnd, WM_CLOSE, NULL, NULL);

혹은 

::SendMessage(GetSafeHwnd(), WM_CLOSE, NULL, NULL);

혹은

::PostQuitMessage(WM_QUIT);


출처 : http://charlesm.egloos.com/1279955




* TerminateProcess

ㄱ. 자기 자신이 아닌 다른 프로세스를 종료시킬 수 있음.

ㄴ. 정리 작업을 하지 않기 때문에 되도록 사용하지 않는 것이 좋음.

ㄷ. 메모릭 발생 위험 있음.


* PostQuitMessage

ㄱ. 단지 메시지 맵에 WM_QUIT 메시지만 전달하는 것이기 때문에 

   이 명령의 다음 코드도 실행이 됨.

ㄴ. 메모릭 발생 위험 있음.

   

* ExitProcess

ㄱ. 프로세스와 연결된 모든 DLL을 종료시키기 위해 

   각 DLL의 DllMain함수가 호출되며 DLL들은 스스로 정리작업을 시도함.

ㄴ. 모든 열려진 핸들을 닫음.(핸들 테이블 제거)

ㄷ. 프로세스 커널 객체와 쓰레드 객체의 상태가 신호상태로 되며 

   이 신호를 기다리는 다른 프로세스 대기 상태를 해제할 수 있음.

ㄹ. 프로세스의 종료코드는 STILL_ACTIVE에서 ExitProcess()인자로 지정한 값으로 변경됨.

ㅁ. 곧바로 정리 작업에 들어가기 때문에 이 명령 뒤의 코드는 실행되지 않음.

ㅂ. 실행중인 모든 쓰레드를 종료시킴.

ㅅ. 메모리 릭 발생 위험 적음.



반응형