我正在编写一个Direct3D 10应用程序,并希望确保我没有COM对象泄漏。
是的,我正在使用CComPtr包装接口,但我仍然想要进行泄漏检查,原因与我仍使用普通堆分配泄漏检测器相同,即使RAII和智能指针保证不会泄漏:有时(特别是当连接到像Direct3D这样的C库时,你必须回退到较低的抽象级别并使用原始指针,new,delete,并且你会犯错误。 (更不用说对Release()的一些调用在程序结束时不返回0)
在我包含atlbase.h之前,我已经#defined _ATL_DEBUG_INTERFACES,但输出窗口中没有任何内容!我还需要做些什么来让_ATL_DEBUG_INTERFACES工作吗?
答案 0 :(得分:3)
如果您正在使用CComPtr,那么这通常是我建议的主要内容,但如果您使用的是Visual Studio,我确实找到了可能有用的内容。
Sara Fords博客有一个非常酷的提示:
Debugging AddRef/Release issues in VS
您可能会记录 lot 的信息,但基本的想法是在Visual Studio中跟踪您的addref / release调用,您可以查找不匹配的AddRef / Release对。
可能需要一些腿部工作,但这看起来很狡猾。
编辑2:早上好;
好的,如果您没有使用DllGetClassObject,那么这不会成为参考问题。 使用IUknowns作为输入/输出参数确实有一个警告;这是来自MSDN for AddRef的模糊:
为您指定的每个接口指针的新副本调用此方法 使。例如,如果要从指针传回指针的副本 方法,您必须在该指针上调用AddRef。你也必须打电话 在将指针作为输入输出参数传递给a之前,在指针上添加AddRef 方法;该方法将在复制之前调用IUnknown :: Release 超出它的价值。
同样适用于发布:
当您不再需要使用接口指针时调用此方法。 如果您正在编写一个采用输入输入参数的方法,请调用 在复制out-value之前释放您传入的指针 在它之上。