我正在编写一个Direct3D 10应用程序,希望确保没有COM对象泄漏。
是的,我正在用CComPtr包装接口,但我还是希望进行泄漏检查,因为同样的原因,我仍然使用普通的堆分配泄漏检测器,尽管RAII和智能指针保证不会有泄漏:有时(特别是当与Direct3D这样的C库接口时),您必须回到更低的抽象级别,使用原始指针、新的、删除的,然后就会出错。(更别提在程序结束时释放()的一些调用不返回0)
在包含atlbase.h之前,我已经定义了_ATL_DEBUG_INTERFACES,但是输出窗口中什么都没有出现!为了让_ATL_DEBUG_INTERFACES开始工作,我还需要做些什么吗?
发布于 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,然后在其之上复制出值。
同样用于释放:
当您不再需要使用接口指针时调用此方法。如果您正在编写接受输入输出参数的方法,则在将输出值复制到指针上面之前,先调用要传入的指针的释放。
https://stackoverflow.com/questions/7087950
复制相似问题