请教,关于多线程激发事件时,造成的内存泄漏问题,100分诚赠。
qscj 2003-08-22 06:29:09 *概要
ATL的封装函数IConnectionPointImplMT<T, piid, CDV>::GetInterfaceAt(int nConnectionIndex)在其内部调用IGlobalInterfaceTable::GetInterfaceFromGlobal(DWORD dwCookie, REFIID riid,void **ppv)时发生内存泄漏,原ATL封装函数如下:
template <class T, const IID* piid, class CDV>
LPUNKNOWN IConnectionPointImplMT<T, piid, CDV>::GetInterfaceAt(
int nConnectionIndex)
{
m_CPMTCritSec.Lock();
LPUNKNOWN pUnk = NULL;
// IConnectionPointImplMT Vector stores DWORDs instead of IUnknown pointers,
// explicit cast required:
DWORD dwGITCookie = (DWORD)(m_vec.GetAt(nConnectionIndex));
if (dwGITCookie != NULL)
{
IID iid;
GetConnectionInterface(&iid);
//HRESULT hr = S_OK;
/*!*/ HRESULT hr = m_pGIT->GetInterfaceFromGlobal( // <- 就是这条!!
dwGITCookie, iid, reinterpret_cast<void **>(&pUnk));
ATLASSERT(hr == S_OK);
}
m_CPMTCritSec.Unlock();
return pUnk;
}
*我实在找不到解决方法
我想当然:既然GetInterfaceFromGlobal()申请了资源,必然有一个对应的函数可以释放掉,但我仔细阅读过MSDN,也都仔细试过,三个函数没有一个能实现:IGlobalInterfaceTable::GetInterfaceFromGlobal()
IGlobalInterfaceTable::RegisterInterfaceInGlobal()
IGlobalInterfaceTable::RevokeInterfaceFromGlobal()
*我也全都按照微软网站上的方法做了
把
class CProxy_IEvntFirerEvents : public IConnectionPointImpl<T, &DIID__IEvntFirerEvents, CComDynamicUnkArray>
换成
class CProxy_IEvntFirerEvents : public IConnectionPointImplMT<T, &DIID__IEvntFirerEvents, CComDynamicUnkArray>
把
pT->Lock();
CComPtr<IUnknown> sp = m_vec.GetAt(nConnectionIndex);
pT->Unlock();
换成
CComPtr<IUnknown> sp;
sp.Attach (GetInterfaceAt(nConnectionIndex));
我也试了其它的释放方法,要么行不通,要么无效。
请各位高手帮我,谢谢!