C++如何将智能指针传递给将修改指针的输出参数

标签 c++ parameters output smart-pointers xaudio2

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

但是我在调​​用 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/

相关文章:

c++ - C++ 教程中的 2D 游戏开发

delphi - delphi SDI中创建新表单时传递参数

c++ - 从 Eclipse IDE 运行 C++ 应用程序

c - 返回 C 中正因子计数的方法

scala - 在scala中我可以将重复的参数传递给其他方法吗?

python - 只要不输入空就打印数字

c - 这是 C 中的未定义行为吗?如果不能逻辑地预测输出

c++ - 不能推 GlDouble vector 的 vector 吗?

c++ - ofstream 不会在 Windows7 中将换行符打印到 txt

c++ - 键盘重复计数