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

标签 com memory-leaks

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

我读过将初始化的 CComBSTR 的地址作为 [out] 参数传递给函数会导致泄漏。我正在寻找像这样枚举其他常见的编程错误。

最佳答案

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

我见过的另一个泄漏或意外释放的原因是从 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/

相关文章:

c++ - 为什么在 VB6 中 COM 接口(interface)名称被 coclass 名称替换?

c++ - ImpersonateLoggedOnUser 并启动使用 ocx 的新进程失败

构造函数中的 C++ 单例

objective-c - Xcode 静态分析器没有检测到泄漏?

python - 在循环中调用 openopt SNLE 时出现“内存泄漏”

golang websocket内存泄漏

objective-c - NSKeyedUnarchiver 内存泄漏

java - 在 Java 中使用 COM 程序集

c# - 用双百分号扩展环境变量

c# - 哪一个是错误的? Msdn 或头文件