执行以下代码时,我遇到了一些内存访问冲突:
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。
任何帮助都会非常有用!
提前致谢
此致 费边
答案 0 :(得分:0)
&
中的SafeArrayCopy(pList1, &mergeResult);
引起了对文档确认的怀疑:该函数没有从源数组复制到您分配的函数,它会用新的数组覆盖指针(泄漏它)。相同的维度。但是,您对SafeArrayRedim
的调用似乎会解决(部分)问题。
此外,您负责检索pList2的下限,但在实际复制期间不使用它。
然后,我不确定智能指针是否完全正确使用。我想也许你应该把它的声明放在循环中。
最后,我想我找到了真正的罪魁祸首:SafeArrayPutElement
的文件说:
变量类型VT_DISPATCH,VT_UNKNOWN和VT_BSTR是指针,不需要其他级别的间接。
这意味着您应该移除&
中的(void*)&ptrActivity
。