COM 内存泄漏最常见的原因是什么?
我读过将初始化的 CComBSTR 的地址作为 [out] 参数传递给函数会导致泄漏。我正在寻找像这样枚举其他常见的编程错误。
最佳答案
未能为 COM 对象使用 RAII 包装类型。特别是不使用 CComPtr<>
、 CComBSTR
和 CComVARIANT<>
。这些对象通过消除开发人员释放底层资源的责任来帮助防止泄漏。包装对象在其析构函数中强制释放资源。
我见过的另一个泄漏或意外释放的原因是从 CComPtr<T>
到 T*
的隐式转换的结果。这对于将包装的对象作为参数传递很有用。但它可能会导致问题,因为它允许在 RAII 对象和原始指针之间进行隐式转换。例如
CComPtr<IFoo> GetAFoo(); // Imagine if this creates the object
...
IFoo* pFoo = GetAFoo();
pFoo->SomeCall();
在这种情况下,对 SomeCall 的调用可能会失败,因为此时对象 pFoo 已死。为什么?该值从 GetAFoo 返回,引用计数为 1,分配给 pFoo,然后递减为 0 并删除,因为临时值超出范围。
关于com - COM 内存泄漏的常见原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1743607/