Мне нужно передать данные из 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#? Или как я могу это сделать?
SAFEARRAY
использует общую кучу. Вызывающий может уничтожить его. Вам не нужно экспортировать делокатор. - person David Heffernan   schedule 18.08.2017