카테고리 없음
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. 루나 / 한빛미디어)