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