2014년 3월 22일 토요일

VS2010 MFC App에서 OpenCV 메모리 누수 문제

MFC App에 OpenCV를 링크에서 사용할 때 Debug 모드에서 프로그램 종료 시 메모리 누수(memory leak) 리포트를 볼 수 있다. 증상을 보면 실제 메모리가 누수되는 것이 아니고 _CrtDumpMemoryLeaks()가 호출되는 시점이 OpenCV DLL이 정리되는 시점보다 빨라서 발생하는 false alarm으로 보인다. 따라서 무시하고 개발을 강행하고 나서 Release build를 사용해도 되겠으나 그렇게 하면 내가 작성한 코드에서의 버그에 의해 발생하는 메모리 누수를 디버깅하기 어렵게 된다.

이 문제에 대해 검색을 해보니 제시되고 있는 해결 방법은 아래와 같이 3가지로 요약된다.

  1. MFC DLL을 링크하도록 OpenCV를 rebuild하여 사용한다. (opencv_core에 afx.h를 include하는 등의 약간의 소스 수정 포함 - 자료 출처)
  2. MFC를 static library로 사용한다.
  3. OpenCV를 delay load로 사용한다.
위의 방법들을 실제로 시도해보았으나 OpenCV 이외의 함께 사용하는 3rd party library들의 상황에 따라 여의치 않은 문제가 있다. 그래서 가장 변경 범위가 적은 3번 방법을 사용하여 보았으나 그래도 메모리 누수 리포트가 발생한다.

하나하나 원인을 점검하다 보니, Visual Studio에서 default로 만든 MFC Application이 유니코드로 되어 있어 C런타임이 MSCVR?UD.dll 로 연결되나, OpenCV는 MSVCR?D.dll로 연결되기 때문이 아닌가 싶다. OpenCV를 유니코드 프로젝트로 다시 빌드하는 것은 std::string 부분에서 많은 에러가 나서 포기하고, 어쩔 수 없이 내 MFC Application을 MBCS로 전환하니 메모리 누수 (리포트) 현상이 사라졌다. 요약하면,
  
  1. OpenCV를 사용하기 위해 Unicode App로 작성하는 것을 포기
  2. opencv_core 등의 dll을 링커(Linker)/입력(Input) 항목의 '지연 로드된 DLL(Delay Loaded DLLs)'에 등록한다.

댓글 없음:

댓글 쓰기