0

所有原始指针都需要在程序中使用智能指针进行处理。

但是我遇到了这个 Xaudio2 调用的问题

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

我的问题是在将智能指针作为指向指针的指针传递时如何使用它,这甚至可能吗?如果不是,我应该如何以聪明的方式解决这个问题?即如何为参数传递智能指针_Out_ IXAudio2 **ppXAudio2

任何帮助都感激不尽。

4

1 回答 1

2

这里有两个问题——首先是处理函数需要一个指向(非常量!)原始指针的原始指针这一事实,其次是解决所有内置智能指针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. 如果您可以访问其中之一,则可以使用它而不是自己滚动。

于 2014-11-14T16:39:40.833 回答