COM_INTERFACE_ENTRY_BREAK宏不起作用

时间:2012-03-06 11:30:35

标签: c++ debugging com atl

我有一个ATL课程。我想知道何时调用此类的QueryInterface以消除内存泄漏。

我在COM_INTERFACE_ENTRY_BREAK中添加了COM_MAP,现在看起来像是:

BEGIN_COM_MAP( CMyClass )
      COM_INTERFACE_ENTRY( IFace1 )
      COM_INTERFACE_ENTRY( IFace2 )

      //COM_INTERFACE_ENTRY_BREAK(IUnknown) // i included this too
      COM_INTERFACE_ENTRY_BREAK( IFace1 )
      COM_INTERFACE_ENTRY_BREAK( IFace2 )
END_COM_MAP()

当我开始调试(按F5)时,我在QI操作后没有断点。我确定调用QI是因为_ATL_DEBUG_INTERFACES在输出窗口中显示泄漏

ATL: QIThunk - 4 LEAK : Object = 0x02150CC0 Refcount = 1 MaxRefCount = 2 CMyClass - IUnknown

为了在QI呼叫时停止断点,我该怎么做?

谢谢。

2 个答案:

答案 0 :(得分:2)

显然,您需要在AddRef()调用上使用断点,而不是QI调用。是的,痛苦的,如果您使用ATL包装器,从服务器查找客户端代码中的引用计数错误效果不佳。与通过在新/删除操作符上设置断点来尝试诊断内存泄漏没有本质上的区别,这也不能很好地工作。

您可以在atlcom.h内的InternalAddRef()方法上设置断点。但它可能会很嘈杂,如果您的服务器中有很多接口,它可能会导致调试器一段时间内变形紧张。

答案 1 :(得分:1)

我已经用COM_INTERFACE_ENTRY_FUNC_BLIND宏解决了这个问题:

BEGIN_COM_MAP(CMyClass)
  COM_INTERFACE_ENTRY(IDummy) // NB!: this has to go before COM_INTERFACE_ENTRY_FUNC_BLIND
  COM_INTERFACE_ENTRY_FUNC_BLIND(0, MyQueryInterface)
END_COM_MAP

MyQueryInterface是每次接口查询时调用的函数。

我的功能是:

QueryInterfaceFunc ( void* pv, REFIID riid, LPVOID* ppv, DWORD dw )
{
  if (riid == __uuidof(IFace1))
  {
    DebugBreak(); // Break here in the case of querying IFace1
  }
}