我有一个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呼叫时停止断点,我该怎么做?
谢谢。
答案 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
}
}