COM内存泄漏的常见原因是什么?

Jul*_*ian 4 com memory-leaks

COM内存泄漏最常见的原因是什么?

我已经读过将初始化的CComBSTR的地址作为[out]参数传递给函数会导致泄漏.我想列举其他常见的编程错误.

Jar*_*Par 7

未能为COM对象使用RAII包装类型.特别是不使用CComPtr<>,CComBSTRCComVARIANT<>.这些对象通过消除从开发人员释放底层资源的责任来帮助防止泄漏.包装对象强制在其析构函数中释放资源.

我见过的泄漏或意外释放的另一个原因是隐式转换CComPtr<T>T*.这对于将包装对象作为参数传递很有用.但它可能会导致问题,因为它允许RAII对象和原始指针之间的隐式转换.例如

CComPtr<IFoo> GetAFoo();  // Imagine if this creates the object
...
IFoo* pFoo = GetAFoo();   
pFoo->SomeCall();  
Run Code Online (Sandbox Code Playgroud)

在这种情况下,对SomeCall的调用可能会失败,因为此时对象pFoo已经死了.为什么?返回值为GetAFoo的ref计数为1,分配给pFoo,然后递减为0并删除,因为临时值超出范围.