所有原始指针都需要在程序中用智能指针处理。
但是我在调用 Xaudio2 时遇到了问题
HRESULT XAudio2Create(_Out_ IXAudio2 **ppXAudio2, _In_ UINT32 Flags,
_In_ XAUDIO2_PROCESSOR XAudio2Processor);
我的问题是,当将智能指针作为指向指针的指针传递时,您如何使用智能指针,这甚至可能吗?如果不是,我应该如何巧妙地解决这个问题?即如何为参数传递智能指针 _Out_ IXAudio2 **ppXAudio2
任何帮助将不胜感激。
最佳答案
这里有两个问题——首先是处理函数需要一个指向(非常量!)原始指针的原始指针这一事实,其次是解决所有内置智能指针调用 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
。如果您有权访问其中之一,则可以使用它而不是自己滚动。
关于C++如何将智能指针传递给将修改指针的输出参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26934378/