【发布时间】:2019-09-07 11:07:21
【问题描述】:
我使用 VC++ 2017 创建了一个 C++ 控制台应用程序。随着时间的推移,它会进行多次调用以从第 3 方 COM DLL 检索数据。我使用 CComSafeArray 和 CComVariant 等 COM 类来管理它们自己的释放。
随着时间的推移,我发现我的应用程序的内存在每次 COM 调用后在任务管理器中稳步增加。
我已使用 CRT 库 (https://docs.microsoft.com/en-us/visualstudio/debugger/finding-memory-leaks-using-the-crt-library?view=vs-2019) 尝试检测内存泄漏,但它表明我没有。
我的问题是/是:
- COM 是否通常进行 CRT 自己的内存管理 库无法检测到但与我的进程相关联?
- 如果 #1 是这种情况,是否有可用于检测 COM 内存的工具 泄漏?
- 如果是 #1,有没有办法对 COM 内存进行垃圾收集?
感谢您的考虑。
2019 年 4 月 19 日编辑 我发现 COM Dll 返回函数调用结果的 VARIANT 和 BSTR。我将它们分别分配给 _variant_t 和 _bstr_t 以提供自动清理(理论上)。 例如。
_variant_t v = GetSomeVariant();
_bstr_t b = GetSomeString();
DLL 不使用 CoTaskMemAlloc,但它使用 SysAllocString 来生成 BSTR。
【问题讨论】:
-
通过任务管理器观察内存增加并不是判断内存增加的可靠方法。当您
delete/delete[]/free/etc内存时,通常它不会直接返回操作系统。它保留供以后使用。 -
考虑查看this question中的答案
-
好吧,如果这是一个现代应用程序,那么 COM 对象的大量泄漏就不足为奇了,因为 MS 大多通过以前在 COM 中使用的引用计数放弃了对象生命周期管理的弱概念。因此,与其跟踪 COM 内存泄漏,不如专注于让应用在因资源耗尽而被终止后正确重启。
-
@VTT:如果我可以对 cmets 投反对票,我会投反对票。
标签: c++ visual-c++ memory-leaks com