경험적으로 현재 프로젝트에서 메모리 릭이 발생한 경우는 크게 3가지이다.
- 메모리를 할당하고 해제하지 않았다.
- array 버전인 new [ ]로 할당하고 delete로 해제했다.
- 다른 클래스를 상속하였는데 super class가 가상 소멸자를 갖지 않았다.
1번과 2번의 경우는 std::unique_ptr을 사용하면 편해지지만 3번의 경우는 정말 어디서 발생했는지 알지 못하는 경우가 많다. cppcheck 같은 정적 분석기도 못 찾아줬고, Visual Leak Detector나 Dr.Memory 같은 별도의 메모리 분석 도구를 연동한 상태로 실행해야 찾을 수 있는데 이것도 단점이 있다.
- 메모리 릭을 발생한 지점이 실행되지 않으면 찾을 수 없다.
- 대부분의 경우 추가 메모리가 많이 필요하다.
- 결정적으로 매우 느리다.
그래서 찾아보다 보니 Visual Studio에는 이미 훌륭한 컴파일러 경고가 있었다. 기본적으로 꺼져있는데 켜기만 하면 컴파일 시점에 잠재적인 메모리 릭을 알 수 있다. 물론 단점이 있다면 3rd Party Library 같은 경우 인터페이스에 가상 소멸자가 없는 경우가 더러 있는데 이 정도 수고야 뭐... 헤더에 가상 소멸자를 호출하고 다시 컴파일하면 그만이다.
MSDN
'class' : class has virtual functions, but destructor is not virtual
When a class has virtual functions but a nonvirtual destructor, objects of the type might not be destroyed properly when the class is destroyed through a base class pointer.
사용법
#pragma warning(default : 4265) // 기본적으로 꺼져있는 Warning은 default를 통해서 다시 켤 수 있다.
이렇게 하면 가상 함수가 있는 클래스에 가상 소멸자가 없는 경우 경고를 발생시키고, "Warning as error" 옵션을 켰다면 (당연히 켰겠지만) 컴파일이 실패한다.
'Game Dev > Article' 카테고리의 다른 글
Light Indexed Deferred Rendering (0) | 2016.10.08 |
---|---|
CppCon2014 : C++ in Huge AAA Games (0) | 2016.10.08 |
x64와 x86에서의 float 연산 (0) | 2014.10.30 |
함수 객체의 장점 (0) | 2014.07.24 |