MFC의 예외 처리(CException)는 일반 C++ 예외와는 조금 다른 관리 방식이 있어서 헷갈리기 쉽습니다. 핵심은 MFC의 예외 객체는 보통 힙에서 생성되고, 반드시 Delete()로 해제해야 한다는 점입니다.
상황 분석
- try { } catch (...) { } 여기서 catch (...)는 모든 예외 타입을 잡습니다. 하지만 구체적인 타입(CException*)을 지정하지 않았기 때문에, 예외 객체에 접근할 수 없습니다.
- MFC에서 CException은 보통 new로 생성된 후 던져집니다. 따라서 catch (CException* e)로 받아서 e->Delete()를 호출해야 메모리 누수가 발생하지 않습니다.
- catch (...)만 쓰면 CException* 포인터를 받을 수 없으므로, Delete()를 호출할 기회가 없습니다 → 메모리 누수 발생 가능.
올바른 사용 예
try
{
// 예외 발생 가능 코드
}
catch (CException* e)
{
e->ReportError(); // 필요시 에러 메시지 출력
e->Delete(); // 반드시 해제
}
만약 모든 예외를 잡고 싶다면, catch (...)를 추가로 두되 CException*을 먼저 처리해야 합니다:
try
{
// 예외 발생 가능 코드
}
catch (CException* e)
{
e->ReportError();
e->Delete();
}
catch (...)
{
// 기타 예외 처리
}
결론
- catch (...)만 사용하면 MFC 예외 객체(CException)가 해제되지 않아 메모리 누수가 발생합니다.
- 반드시 catch (CException* e)에서 Delete()를 호출해야 안전합니다.
- catch (...)는 보조적으로만 사용하세요.
LIST
'MFC' 카테고리의 다른 글
| MSXML에서 createElement를 사용할 때 자동으로 xmlns="" 속성이 붙는 이유와 막는 방 (0) | 2025.12.19 |
|---|---|
| BluetoothFindFirstDevice Example (0) | 2024.10.21 |
| CFileDialog의 Title 이름 변경하는 방법 (0) | 2024.01.16 |
| MFC 단축키 Accelerator 리소스 추가 (0) | 2024.01.16 |
| 최근 열어본 파일 MRU Menu Items 처리 커스텀 방법 (1) | 2024.01.15 |