5

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

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

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

4

1 回答 1

4

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

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

在 VS 中调试 AddRef/Release 问题

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

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

编辑2:早上好;

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

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

同样对于发布:

当您不再需要使用接口指针时调用此方法。如果您正在编写一个采用 in-out 参数的方法,请在您传入的指针上调用 Release,然后再将 out-value 复制到它上面。

于 2011-08-19T23:22:48.517 回答