首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检测Ref计数的COM对象上的内存泄漏(Addref不发布)

检测Ref计数的COM对象上的内存泄漏(Addref不发布)
EN

Stack Overflow用户
提问于 2011-08-17 04:27:48
回答 1查看 3.9K关注 0票数 5

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

是的,我正在用CComPtr包装接口,但我还是希望进行泄漏检查,因为同样的原因,我仍然使用普通的堆分配泄漏检测器,尽管RAII和智能指针保证不会有泄漏:有时(特别是当与Direct3D这样的C库接口时),您必须回到更低的抽象级别,使用原始指针、新的、删除的,然后就会出错。(更别提在程序结束时释放()的一些调用不返回0)

在包含atlbase.h之前,我已经定义了_ATL_DEBUG_INTERFACES,但是输出窗口中什么都没有出现!为了让_ATL_DEBUG_INTERFACES开始工作,我还需要做些什么吗?

EN

回答 1

Stack Overflow用户

发布于 2011-08-19 23:22:48

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

萨拉·福兹的博客有一个很酷的建议:

调试VS中的AddRef/发布问题

您可能会获得大量记录的信息,但基本思想是跟踪Visual中的AddRef/Release调用,并且可以查找与addref/release不匹配的对。

可能有点跑腿,但看起来是个很狡猾的主意。

编辑2:早上好;

好的,如果您不使用DllGetClassObject,那么这将不是一个引用问题。但是,使用IUknowns作为in/out参数确实有一个警告;这是AddRef的MSDN中的blurb:

对创建的接口指针的每个新副本调用此方法。例如,如果要从方法中传回指针的副本,则必须对该指针调用AddRef。在将指针作为输入参数传递给方法之前,还必须在指针上调用AddRef;该方法将调用IUniUni知名::Release,然后在其之上复制出值。

同样用于释放:

当您不再需要使用接口指针时调用此方法。如果您正在编写接受输入输出参数的方法,则在将输出值复制到指针上面之前,先调用要传入的指针的释放。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7087950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档