在连接更改时迭代IConnectionPointImpl,导致内存访问冲突

时间:2016-05-06 17:57:51

标签: c++ com atl

在此代码中,我在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, &params, 0, NULL, NULL);
    }
    return hr;
}

我想在迭代m_vec时会删除连接。这是有效的猜测吗?我应该照顾并发射击和订阅吗?当我使用越界索引调用getAt对象的CComDynamicUnkArray方法时会发生什么?

{p> LockUnlock仅在getAt左右是我在几个地方看到的常见做法。并发订阅没有问题。但是,我怎样才能保护自己不被同时取消订阅?

0 个答案:

没有答案