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;

私が受け取ったメッセージは次のとおりです。

どんな助けでも非常に役に立ちます!

前もって感謝します

よろしく、 ファビアン

4

1 に答える 1

0

&ドキュメントが確認した疑惑が提起されました。SafeArrayCopy(pList1, &mergeResult);関数はソース配列から割り当てられた配列にコピーせず、ポインターを同じ次元の新しい配列で上書きします (リークします)。ただし、への呼び出しSafeArrayRedimは問題 (の一部) を処理しているように見えます。

また、pList2 の下限を取得するように注意しますが、実際のコピーでは使用しません。

それでは、スマート ポインターが正確に使用されているかどうかはわかりません。おそらく、その宣言をループ内に配置する必要があると思います。

最後に、本当の犯人を見つけたと思います: ドキュメントのSafeArrayPutElement言う:

バリアント型 VT_DISPATCH、VT_UNKNOWN、および VT_BSTR はポインターであり、別のレベルの間接化は必要ありません。

つまり、&inを削除する必要があります(void*)&ptrActivity

于 2013-06-18T13:12:37.267 に答える