检测Ref-counting COM对象上的内存泄漏(Addref不释放)

时间:2011-08-17 04:27:48

标签: com directx atl smart-pointers direct3d10

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

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

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

1 个答案:

答案 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之前释放您传入的指针   在它之上。