어떤 변수를 수정해 주었는데 전혀 다른 변수가 같이 수정되는 현상.
사실 이런 경우 대부분은 포인터가 꼬인 상황이다. 나의 경우 그 원인은 BSTR이었다. BSTR은 아닌 척 하고 있지만 사실은 wchar * 형이다. 포인터 형식이므로 마구잡이로 할당해주면 같은 주소 공간을 여러 변수가 참조하게 되는 상황이 발생하고 위와 같은 문제가 일어날 수 있으니 주의하자. 나는 결국 BSTR을 버리고 CString을 사용해서 문제를 해결했다.
메모리 누수 현상
Resource Monitor프로젝트를 진행하다가 처음으로 메모리 누수 현상을 겪었다. 메모리 누수의 원인은 보통 동적할당을 해주었는데 해제를 제때 안해주었을 때 발생한다. 동적할당은 new 혹은 malloc 등의 함수를 사용할 때가 많다. 필요 없어진 포인터는 꼭 delete 를 사용해 해제해주어야 한다. 아니면 스마트 포인터를 쓰던가...
그런데 나의 경우 new 나 malloc이 문제가 아니었다. 잘 모르는 라이브러리를 사용할 때에는 그냥 무지성으로 MSDN이나 인터넷 예제를 긁어오고 대강 파악해가며 수정하는 경우가 많다. 그러다 보면 나처럼 WMI의 IWbemObjectAccess 와 같은 클래스나 VARIANT 타입의 변수 같은 잘 모르는 놈들을 사용하게 된다. 그런데 이런 놈들을 사용할 때에는 사용법을 꼭 지켜줘야한다. 특히 예제에서 Release나 Clear 같은 함수를 호출하거나 NULL을 할당해주거나 하면 별거 아니라고 무시하지 말고 꼭 코드에 포함해주자. 이런 녀석들 때문에 메모리 누수가 발생할 수도 있다.