gpt4 book ai didi

C++ 在 COM DLL 中调用函数可能的内存泄漏

转载 作者:行者123 更新时间:2023-11-28 04:19:46 26 4
gpt4 key购买 nike

我使用 VC++ 2017 创建了一个 C++ 控制台应用程序。随着时间的推移,它会进行多次调用以从第 3 方 COM DLL 检索数据。我使用 COM 类,如 CComSafeArray 和 CComVariant 来管理它们自己的释放。

随着时间的推移,我发现在每次 COM 调用后,我的应用程序的内存在任务管理器中稳步增加。

我已经使用 CRT 库 ( https://learn.microsoft.com/en-us/visualstudio/debugger/finding-memory-leaks-using-the-crt-library?view=vs-2019 ) 尝试检测内存泄漏,但它表明我没有。

我的问题是:

  1. COM 是否通常进行 CRT 自己的内存管理?库无法检测到但与我的进程相关联?
  2. 如果 #1 是这种情况,是否有可用的工具来检测 COM 内存泄漏?
  3. 如果#1 是这种情况,有没有办法对 COM 内存进行垃圾回收?

感谢您的考虑。

编辑 4-19-2019我发现 COM Dll 返回函数调用结果的 VARIANT 和 BSTR。我将它们分别分配给 _variant_t 和 _bstr_t 以提供自动清理(理论上)。例如。

_variant_t v = GetSomeVariant();
_bstr_t b = GetSomeString();

DLL 不使用 CoTaskMemAlloc,但它确实使用 SysAllocString 来生成 BSTR。

最佳答案

COM 不使用任何自动垃圾收集;一切都必须考虑在内,尽管有可用的帮助类来处理引用计数。

COM 中的惯例是,如果被调用的方法分配了一些内存,那么调用者必须使用 CoTaskMemFree 释放它。 .您可能想检查您调用的 DLL 方法的代码,如果它们在 DLL 分配的缓冲区中返回任何内容,那么您需要通过调用 CoTaskMemFree 释放该缓冲区。 .

参见 https://learn.microsoft.com/en-us/windows/desktop/learnwin32/memory-allocation-in-com

此处有更多详细信息:https://learn.microsoft.com/en-us/windows/desktop/com/memory-management-rules

关于C++ 在 COM DLL 中调用函数可能的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55723536/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com