본문 바로가기

일하면서 사용한 짧은 지식/C++, DirectX11

C++에서 인터페이스로 사용하기 위해 Class를 정의한다면, 소멸자에 virtual를 지정해 줘야 한다.

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; 이렇게 추가하고 빌드 에러가 발생하여 당황했었다.