Как я могу освободить память C++ Safearray в C#

Мне нужно передать данные из C++ DLL в среду C#. Поэтому я использую 2d SafeArray двойников.

Эта функция передает данные из C++ в C#:

void GetIndividualExposures(SAFEARRAY*& data)
{
    SAFEARRAYBOUND bounds[2];
    bounds[0].lLbound = 0;
    bounds[0].cElements = 10;
    bounds[1].lLbound = 0;
    bounds[1].cElements = 20;

    long l_dimensions[2];
    int index = 0;

    data = SafeArrayCreate(VT_R8, 2, bounds);
    double **pVals;

    HRESULT hr = SafeArrayAccessData(data, (void**)&pVals);
    if (SUCCEEDED(hr))
    {
        for (ULONG i = 0; i < bounds[0].cElements; i++)
        {
            for (ULONG j = 0; j < bounds[1].cElements; j++)
            {
                l_dimensions[0] = i;
                l_dimensions[1] = j;
                SafeArrayPutElement(data, l_dimensions, &data_source[i][j]);
            }
        }
        SafeArrayUnaccessData(data);
    }
}

Это работает, хорошо, все данные доступны по мере необходимости в моей среде C#. Однако я получаю утечку памяти. Я попытался использовать вторую функцию C++, чтобы освободить память:

void DeallocateExternal(SAFEARRAY*& data)
{
    SafeArrayDestroy(data);
    data = NULL;
}

но это не имеет никакого эффекта. Что я сделал не так? Есть ли возможность освободить память SafeArray после использования в C#? Или как я могу это сделать?

0 ответов

Другие вопросы по тегам