未能为COM对象使用RAII包装类型.特别是不使用CComPtr<>,CComBSTR和CComVARIANT<>.这些对象通过消除从开发人员释放底层资源的责任来帮助防止泄漏.包装对象强制在其析构函数中释放资源.
我见过的泄漏或意外释放的另一个原因是隐式转换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并删除,因为临时值超出范围.
| 归档时间: |
|
| 查看次数: |
583 次 |
| 最近记录: |