1. 문제 상황
C++ 코드로 DirectX11을 활용하여 렌더러를 만드는 작업 중이었다.
여러 조건에 따라 옵션을 교체하여 사용하기 위해 인터페이스 클래스를 구현하고 이를 상속받아 각각의 클래스를 구현하였었다.
그런데 해당 클래스에서 사용하는 DirectX 리소스가 해제가 안되어, 재할당할 때 프로그램이 다운되는 에러가 발생했었다.
디버깅하여 확인해보니 리소스가 해제되는 조건에서 delete가 호출되어도 소멸자가 호출 안되고 있었다.
2. 원인
인터페이스를 정의할 때 공통으로 사용할 메시지만 정의하였지 소멸자를 신경 쓰지 않았었다.
인터페이스에 가상 소멸자를 추가하지 않아 delete 호출 시 인터페이스를 상속받은 클래스의 소멸자가 실행되지 않는다.
public class Interface
{
public:
virtual void Update() = 0;
};
3. 해결
아래와 같이 인터페이스에 가상 소멸자를 추가 해주면 delete 호출 시 인터페이스에 연결된 소멸자가 실행된다.
public class Interface
{
public:
virtual ~Interface() {};
virtual void Update() = 0;
};
인터페이스에 가상소멸자에 {} 선언부를 추가하지 않으면 LNK2019 / LNK1120에러가 발생한다.
시행착오> 처음에 virtual ~Interface() = 0; 이렇게 추가하고 빌드 에러가 발생하여 당황했었다.
'일하면서 사용한 짧은 지식 > C++, DirectX11' 카테고리의 다른 글
Direct2D에서 SetTransform으로 설정한 값 초기화하기 (0) | 2022.03.22 |
---|---|
DirectX11의 Shader를 컴파일하여 헤더파일로 만들기 (0) | 2022.01.05 |
ID2D1GeometrySink의 AddLines 메서드를 이용해 ID2D1PathGeometry*에 Underline(밑줄), Strikethrough(취소선) 추가하기 (0) | 2021.11.11 |
GDI의 LOGFONT에서 DirectWrite 폰트를 생성할 때 가져오지 못하는 정보도 있다. (Underline, StrikeOut) (0) | 2021.11.10 |
Direct2D Factory를 통해 생성한 리소스는 모두 같은 Factory에서 생성해야한다. (0) | 2021.11.08 |