在此代码中,我在CComPtr<IUnknown> punkConnection = m_vec.GetAt(i);
行上发现了内存访问冲突:
HRESULT FireImpl()
{
HRESULT hr = S_OK;
T * pThis = static_cast<T *>(this);
int count = m_vec.GetSize();
for (int i = 0; i < count; i++)
{
pThis->Lock();
CComPtr<IUnknown> punkConnection = m_vec.GetAt(i);
pThis->Unlock();
IDispatch* pConnection = static_cast<IDispatch *>(punkConnection.p);
if (pConnection == 0)
continue;
DISPPARAMS params = { NULL, NULL, 0, 0 };
hr = pConnection->Invoke(2, IID_NULL, LOCALE_USER_DEFAULT,
DISPATCH_METHOD, ¶ms, 0, NULL, NULL);
}
return hr;
}
我想在迭代m_vec
时会删除连接。这是有效的猜测吗?我应该照顾并发射击和订阅吗?当我使用越界索引调用getAt
对象的CComDynamicUnkArray
方法时会发生什么?
Lock
和Unlock
仅在getAt
左右是我在几个地方看到的常见做法。并发订阅没有问题。但是,我怎样才能保护自己不被同时取消订阅?