MFC
MFC 예외 객체(CException)가 해제되지 않아 메모리 누수가 발생
leo21c
2025. 12. 23. 16:49
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