GGym's Practice Notes

ComPtr 클래스 (COM Smart Pointer) 본문

카테고리 없음

ComPtr 클래스 (COM Smart Pointer)

GGym_ 2022. 12. 23. 04:56

 기존 C++11서부터 표준이 되었던 Smart Pointer, 그중 shared_ptr은 DirectX에서 함수 파라미터로 요구했던 Pointer to Pointer (Double Pointer)를 매개변수로 전달하기에는 어려움이 있어 ComPtr을 사용해야 한다. 

ComPtr은 기존 스마트포인터와 같이 참조횟수가 0이 되면 메모리에서 해제된다.

 

요구사항

Header :

#include <wrl.h>
or
#include <wrl/client.h>

Namespace :

using namespace Microsoft::WRL;

 

자주 사용하는 메서드

- Get() : 바탕 COM 인터페이스를 가리키는 포인터를 리턴 = shared_ptr의 get()

classname* ptr;
std::shared_ptr<classname> sptr;
Microsoft::WRL::ComPtr<classname> cptr;

// 포인터를 인자로 받는 예제 함수 function(void* p)
function(ptr);	// 기존 포인터
function(sptr.get());	// 스마트 포인터
function(cptr.Get());	// COM 포인터

 

- GetAddressOf() : 바탕 COM 인터페이스를 가리키는 포인터의 주소를 리턴. 함수 매개변수를 통해 COM 인터페이스를 리턴 받을때 쓰인다. Pointer to Pointer를 인자로 하는 매개변수로 줄 때 사용

classname* ptr;
std::shared_ptr<classname> sptr;
Microsoft::WRL::ComPtr<classname> cptr;

// 더블 포인터를 인자로 받는 예제 함수 function(void** p)
function(&ptr);	// 기존 포인터
//function(&sptr); 동작X, 해당 함수 없음
function(cptr.GetAddressOf());	// COM 포인터

 

- Reset() : ComPtr 인스턴스를 nullptr로 설정하고 바탕 COM 인터페이스의 참조 횟수를 1 감소. 직접 nullptr 배정을 해도 되며 이때에도 참조 횟수 1 감소

 

 

참조 :

https://learn.microsoft.com/ko-kr/cpp/cppcx/wrl/comptr-class?view=msvc-170 (Microsoft Learn)

DirectX 12를 이용한 3D 게임 프로그래밍 입문 (프랭크 D. 루나 / 한빛미디어)