본문 바로가기
개발관련

[MFC/API/C++] 윈도API OLE/COM 사용시 메모리릭(Memory Leak)

by 피로곰 2020. 2. 13.
반응형

 

 

윈도 관련 많은 API들이 COM 방식으로 지원을 하는데요..

 

MS의 관련 문서에 예제 코드부터 다양하게 제공을 하고 있습니다만.

 

간혹 이유를 알 수 없는 메모리 누수가 발생하여

곤란해하시는 분들이 계십니다.

 

우선 기본적으로 

 

IUnknown 개체들은 전부 사용 후

Release를 호출해 주셔야 하고요.

 

IUnknown 객체에서 Get으로

얻어온 값을 저장한 변수들도 

반드시 VariantClear 함수로

비워주셔야 합니다.

 

컴파일러 버전에 따라서는 Release 하거나

VariantClear 된 변수라 하더라도 NULL로

초기화를 해주셔야만 레퍼런스 카운트가 감소하여

메모리 해제가 가능한 경우도 있었으니

NULL로도 초기화해주시고요.

 

이렇게 모든 메모리 관련 처리를 하였는데도

지속적으로 메모리 사용량이 누적되고 있다면

 

IUnknown 객체에서 Get으로

얻어오는 값을 저장할 변수를 

 

_variant_t로 선언하시지 않았는지 보십시오.

만약 _variant_t로 선언하여 사용 중이시라면

VARIANT를 사용하시기 바랍니다.

 

MSDN 등에 따르면

_variant_t 가 VARIANT의 Wrap클래스이고

메모리 생성과 해제에 관한 부분을

 

알. 아. 서

 

관리해준다고 명시되어 있습니다만.

 

왜 그런지는 모르겠지만 ;;;

 

_variant_t를 사용하면 메모리 해제가

안되고 계속 쌓이는 경향이 있습니다.

 

VC 2012 시절부터 비슷한 일을 격었는데..

VS 2019 까지도 같은 현상이 발생하네요.

 

프로젝트의 설정에 따라 무언가가

달라질지는 모르겠습니다만.

 

혹시 DIRECTX나 WMI 등 COM 관련한

무언가를 하시는데 메모리 릭의 원인을

찾고 계신다면 VARIANT를 사용해 보십시오.

 

물론 Release와 VariantClear는

기본이니 해당 부분은 먼저 확인하시고요.

 

이상입니다.

 

 

 

 

 

반응형

댓글0