Game Dev/Article

C4265 Warning을 켜자!

AKer 2016. 9. 22. 10:36
반응형

경험적으로 현재 프로젝트에서 메모리 릭이 발생한 경우는 크게 3가지이다.


  1. 메모리를 할당하고 해제하지 않았다.
  2. array 버전인 new [ ]로 할당하고 delete로 해제했다.
  3. 다른 클래스를 상속하였는데 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