2014-11-14 39 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。如果你有权访问其中的一个,你可以使用它而不是自己滚动。