2014-11-14 43 views
0

所有原始指針都需要使用程序中的智能指針來處理。C++如何將智能指針傳遞到將修改指針的輸出參數中

但我有這個Xaudio2通話

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

我的問題一個問題是你怎麼把它當作一個指針的指針,當使用智能指針,是這甚至可能嗎?如果不是,我該如何巧妙地去解決這個問題?我如何通過智能指針參數_Out_ IXAudio2 **ppXAudio2

任何幫助將不勝感激。

+0

由於它是一個* out *參數,因此您可能需要在'XAudio2Create'返回後將其封裝在智能指針中。你需要一個自定義刪除器,但如果有另一個函數你應該調用來釋放這樣創建的對象。 – dlf 2014-11-14 16:23:22

回答

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。如果你有權訪問其中的一個,你可以使用它而不是自己滾動。