Как я могу освободить память безопасного массива С++ в С#

Мне нужно передать данные из dll С++ в среду С#. Поэтому я использую 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);
    }
}

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

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

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


person JKlein    schedule 18.08.2017    source источник
comment
Я не уверен. Думаю, в предложенном вами вопросе не используется SafeArray (или я его не понимаю). Мне жаль.   -  person JKlein    schedule 18.08.2017
comment
Поместите HRESULT hr в IF. Когда i(SUCCEEDED(hr)) равно false, вы не освобождаете память.   -  person jdweng    schedule 18.08.2017
comment
@Sinatr OP говорит о безопасных массивах COM, а не о собственных буферах.   -  person MickyD    schedule 18.08.2017
comment
Почему бы просто не использовать С++/CLI?   -  person MickyD    schedule 18.08.2017
comment
SAFEARRAY использует общую кучу. Вызывающий может уничтожить его. Вам не нужно экспортировать делокатор.   -  person David Heffernan    schedule 18.08.2017
comment
@David Heffernan Спасибо, это очень помогает, но не могли бы вы рассказать, как его уничтожить на C #? Я совсем не в С#? Извиняюсь!   -  person JKlein    schedule 19.08.2017