jef*_*yer 5 com directx atl smart-pointers direct3d10
我正在编写一个 Direct3D 10 应用程序,并希望确保没有 COM 对象泄漏。
是的,我用 CComPtr 包装接口,但无论如何我都想进行泄漏检查,出于同样的原因,我仍然使用普通的堆分配泄漏检测器,即使 RAII 和智能指针保证不会泄漏:有时(特别是在接口时)对于像 Direct3D 这样的 C 库),您必须回退到较低的抽象级别并使用原始指针、new、delete,并且您会犯错误。(更不用说某些对 Release() 的调用在程序结束时不会返回 0)
在包含 atlbase.h 之前,我已经#define _ATL_DEBUG_INTERFACES,但输出窗口中没有出现任何内容!我还需要做些什么才能让 _ATL_DEBUG_INTERFACES 正常工作吗?
如果您使用的是 CComPtr,那么这通常是我建议的主要内容,但如果您使用的是 Visual Studio,我确实找到了一些可能有帮助的东西。
萨拉·福特的博客有一个非常酷的提示:
您可能会记录大量信息,但基本思想是在 Visual Studio 中跟踪您的 addref/release 调用,并且您可以查找不匹配的 AddRef/Release 对。
可能需要一些跑腿工作,但这看起来是一个相当狡猾的想法。
编辑2:早上好;
好的,如果您不使用 DllGetClassObject 那么这不会是引用问题。使用 IUknowns 作为输入/输出参数确实有一个警告;这是来自 MSDN 的 AddRef 简介:
为您创建的接口指针的每个新副本调用此方法。例如,如果要从方法传回指针的副本,则必须对该指针调用 AddRef。在将指针作为输入输出参数传递给方法之前,还必须对指针调用 AddRef;该方法将在将输出值复制到其顶部之前调用 IUnknown::Release。
同样对于发布:
当不再需要使用接口指针时调用此方法。如果您正在编写一个采用输入输出参数的方法,请在您传入的指针上调用 Release,然后再将输出值复制到其顶部。