将CComPtr传递给具有原始指针原型的函数

Sau*_*Sau 5 c++ com smart-pointers

我正在浏览一些处理Windows Imaging Component库的遗留C++代码,我观察到了这一点:

void setProperties(IPropertyBag2* const pBag)
{  
   pBag->Write(...);
}

void other_function()
{
   CComPtr<IPropertyBag2> pBag;
   //Code to initialize pBag
   setProperties(pBag);
}
Run Code Online (Sandbox Code Playgroud)

setProperties方法只是将一堆属性写入属性包.代码编译并运行正常,因为我认为它调用适当的类型转换操作符.

我的问题是,是否建议使用这样的接口,或者是否有更好的传递指针的方法.例如,如果签名更改为:是否存在任何差异(在安全性/性能方面):

void setProperties(const CComPtr<IPropertyBag2>& pBag)
Run Code Online (Sandbox Code Playgroud)

Mar*_*som 3

原始接口指针是使用 COM 对象的规范方法。它们也是最灵活的。使用对 CComPtr 的引用将使您始终使用 CComPtr。

任何 COM 指针,即使是哑指针,也会自动成为智能指针,因为对象本身实现了AddRefRelease。如果函数不保留指针的副本,则无需担心这一点。

为了方便起见,CComPtr 类型会自动将自身转换为原始指针。

  • 使用 CComPtr 参数不会使您始终使用 CComPtr,因为 CComPtr 构造函数不是显式的。并且原始接口指针不是智能指针。忘记释放对象会导致对象泄漏。它具有与忘记“删除”用“new”分配的内存相同的问题。 (4认同)