2014-11-14 5 views
0

프로그램에서 모든 원시 포인터를 Smartpointer로 처리해야합니다.C++ 포인터를 수정하는 출력 매개 변수에 스마트 포인터를 전달하는 방법

하지만이 Xaudio2 호출

HRESULT XAudio2Create(_Out_ IXAudio2 **ppXAudio2, _In_ UINT32 Flags, 
    _In_ XAUDIO2_PROCESSOR XAudio2Processor); 

내 질문에 문제가 발생 포인터에 대한 포인터로 통과 할 때 스마트 포인터를 사용이 가능하다조차 어떻게입니까? 만약 내가 이것을 똑똑한 방법으로 어떻게해야 하는가? 즉, 매개 변수에 스마트 포인터를 전달하는 방법은 무엇입니까? _Out_ IXAudio2 **ppXAudio2

도움을 주시면 감사하겠습니다.

+0

* out * 매개 변수이므로'XAudio2Create'가 반환 된 후에 스마트 포인터로 감싸 야 할 것입니다. 이런 방식으로 생성 된 객체를 릴리스하기 위해 호출해야하는 다른 함수가있는 경우 사용자 정의 deleter가 필요합니다. – dlf

답변

1

여기에는 두 가지 주름이 있습니다. 첫 번째는 함수가 (nonconst!) 원시 포인터에 원시 포인터를 기대한다는 사실을 처리하는 것입니다. 두 번째는 모든 내장 스마트 포인터가 delete을 호출한다는 사실을 해결하는 것입니다. 소유 포인터에 당신이 여기에해야 할 때 그 Release() 메서드를 호출합니다. 팩토리 함수가 반환 될 때까지 똑똑한 포인터를 생성하기를 기다리는 것은 문제 1을 해결할 것이고, 커스텀 델리게터는 문제 2를 해결할 수 있습니다. 당신이하는 일은 당신에게 달렸지 만, 다음과 같이하면됩니다 :

IXAudio2* p = nullptr; 
if(!SUCCEEDED(XAudio2Create(&p, GetFlags(), GetProcessor()))) 
    ; // fail 
std::shared_ptr<IXAudio2> smart(p, 
    [](IXAudio2* p) { p->Release(); }); // or unique_ptr with somewhat different syntax 

부록 : 본질적으로 이렇게 많은 수의 COM 스마트 포인터가 작성되었으며 적절할 경우 AddRef()/RemoveRef()도 호출합니다. 예 : ATL의 CComPtr. 이 중 하나에 액세스 할 수있는 경우 자신의 롤링 대신 사용할 수 있습니다.

관련 문제