원본 : http://www.debuglab.com/knowledge/mfcnull.html
1.요약
char* p = new char [33];
if (!p)
{
// 할당 실패..
}
위와 같은 코드는 MFC에서 아무일도 하지 않습니다
2.본문
많은 분들이 위와 같이 할당이 실패한 경우를 비교하고 계시지만 MFC를 사용하고 계시다면 위의 코드는 아무런 일을 하지 않습니다.
왜냐면, MFC는 할당이 실패한 경우 CMemoryException*을 반환하도록 operator new를 재정의하고 있기 때문입니다.
다시 말해서, 할당이 실패한 경우에는 new 에서 반환된 값이( NULL이겠죠?) p 에 대입되는 코드 조차도 전혀 실행되지 않습니다.
당연히 exception은 스택을 거슬러 거슬러 최초의 catch() 문에 도착하게 되겠죠.
최초의 catch문조차 존재하지 않는다면 프로그램은 비정상 종료하게 될테고, 만약 존재한다면 그곳에서 적절한 처리를 해주어야겠죠.
AfxCallWndProc() 는 실제로 여러분의 메시지 핸들러를 호출해주는 함수중에 하나인데, 다행이도 이곳에는 예외를 처리하는 catch 문이 존재합니다.
이는 OnOK() 같은 핸들러에서 메모리 할당에 실패한 경우 고맙게도 메모리가 부족하다는 메시지를 출력해주고 아무일 없었다는 듯이 계속 진행된다는 얘기가 됩니다.
결론적으로 여러분은 선택이 아니라 필수사항으로 다음과 같이 해주어야 합니다.
char* p = NULL;
try
{
p = new char [33];
}
catch( CMemoryException* e)
{
// 적당히 처리 혹은 e->ReportError();
e->Delete();
}
모든 소스를 수정하기에는 무리가 있는 경우도 있겠죠.
공식적인 방법인지는 모르겠지만, MFC 의 new handler를 대체하는 방법도 있습니다.
int MyHandler(size_t)
{
return 0;
}
AfxSetNewHandler(MyHandler);
물론 스레드마다 해주어야 합니다. MFC 는 CRT의 _set_new_handler를 사용해서 new 핸들러를 설치하는 것이 아니기때문에, _set_new_handler 를 사용하는 경우는 동작하지 않는 것 같습니다.
MFC Internals에 관련된 내용이 나오지 않을까 하는 생각을 하는데요,
혹시 알고 계신 분을 답장글 남겨주시기 바랍니다.
- 2001.08.13 Smile Seo -
- Edit 컨트롤에서 Tab 키 넣기 (0)2007/03/21
- GUID 생성하기 (0)2007/03/21
- MFC에서 NULL을 비교하는 것은 의미가 없다. (0)2007/03/21
- URL을 파싱하자 (0)2007/03/19
- 사용하지 않는 인자에 대한 warning 없애기 (0)2007/03/19

수안이의 컴퓨터 연구실



Leave your greetings.