0

在执行以下代码时,我遇到了一些内存访问冲突:

UINT cDims = 1;

SAFEARRAYBOUND rgsabound[1];
long lLbound = 0;
long lUbound = 0;

rgsabound[0].lLbound = 0;

rgsabound[0].cElements = pList1->rgsabound[0].cElements + pList2->rgsabound[0].cElements;


SAFEARRAY* mergeResult = SafeArrayCreate(VT_DISPATCH, cDims, reinterpret_cast<SAFEARRAYBOUND*>(rgsabound));

// Obtain bounds information of the SAFEARRAY. 
SafeArrayGetLBound(pList2, 1, &lLbound);
SafeArrayGetUBound(pList2, 1, &lUbound);

long lDimSize = lUbound - lLbound + 1;

    GoldMineConstantContactCOM::IBounceActivityPtr ptrActivity;

    SafeArrayCopy(pList1, &mergeResult);

    rgsabound[0].lLbound = 0;
    rgsabound[0].cElements = pList1->rgsabound[0].cElements + pList2->rgsabound[0].cElements;

    SafeArrayRedim(mergeResult, rgsabound);

    for (int i = 0; i < lDimSize; i++)
    {
        long rgIndices[1];
        rgIndices[0] = i;

        HRESULT hRes2 = SafeArrayGetElement(pList2, rgIndices, &ptrActivity);

        rgIndices[0] = rgIndices[0] + pList1->rgsabound[0].cElements;

        HRESULT hRes = SafeArrayPutElement(mergeResult, rgIndices, (void*)&ptrActivity);                
    }

    return mergeResult;

我收到的消息是:0x774115de 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000004。

任何帮助都会非常有帮助!

提前致谢

问候, 法比安

4

1 回答 1

0

&引起了文档确认的SafeArrayCopy(pList1, &mergeResult);怀疑:该函数不会从源数组复制到您分配的数组,它会用相同维度的新数组覆盖指针(泄漏它)。但是,您的电话SafeArrayRedim似乎可以解决(部分)问题。

此外,您还负责检索 pList2 的下限,但在实际复制期间不使用它。

然后,我不确定智能指针的使用是否正确。我想也许你应该把它的声明放在循环中。

最后,我想我找到了真正的罪魁祸首:SafeArrayPutElementsay的文档:

变体类型 VT_DISPATCH、VT_UNKNOWN 和 VT_BSTR 是指针,不需要其他级别的间接。

这意味着您应该删除&in (void*)&ptrActivity

于 2013-06-18T13:12:37.267 回答