gpt4 book ai didi

com - 检测 Ref 计数 COM 对象上的内存泄漏(Addref without Release)

转载 作者:行者123 更新时间:2023-12-01 02:45:03 25 4
gpt4 key购买 nike

我正在编写 Direct3D 10 应用程序并希望确保没有 COM 对象泄漏。

是的,我用 CComPtr 包装了接口(interface),但我还是想要一个泄漏检查,出于同样的原因,我仍然使用普通的堆分配泄漏检测器,即使 RAII 和智能指针保证不会有泄漏:有时(尤其是在连接时对于像 Direct3D 这样的 C 库),您必须回退到较低的抽象级别并使用原始指针、new、delete,并且您会犯错误。 (更不用说一些对 Release() 的调用在程序结束时不会返回 0)

在包含 atlbase.h 之前,我已经 #defined _ATL_DEBUG_INTERFACES,但在输出窗口中什么也没有出现!我还需要做些什么来让 _ATL_DEBUG_INTERFACES 工作吗?

最佳答案

如果您使用的是 CComPtr,那么这通常是我建议的主要内容,但如果您使用的是 Visual Studio,我确实找到了一些可能有帮助的东西。

Sara Fords 博客有一个非常酷的提示:

Debugging AddRef/Release issues in VS

您可能会记录很多信息,但基本想法是在 Visual Studio 中跟踪您的 addref/release 调用,您可以查找不匹配的 AddRef/Release 对。

可能有点跑腿,但它看起来是一个非常狡猾的想法。

编辑2:早上好;

好的,如果您不使用 DllGetClassObject 那么这不会是一个引用问题。
使用 IUknowns 作为输入/输出参数确实有一个警告;这是来自 MSDN 的 AddRef 简介:

Call this method for every new copy of an interface pointer that you make. For example, if you are passing a copy of a pointer back from a method, you must call AddRef on that pointer. You must also call AddRef on a pointer before passing it as an in-out parameter to a method; the method will call IUnknown::Release before copying the out-value on top of it.



同样对于发布:

Call this method when you no longer need to use an interface pointer. If you are writing a method that takes an in-out parameter, call Release on the pointer you are passing in before copying the out-value on top of it.

关于com - 检测 Ref 计数 COM 对象上的内存泄漏(Addref without Release),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7087950/

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