Как я могу удалить SafeArray, возвращаемый из функции .NET в собственном коде?

StackOverflow https://stackoverflow.com/questions/5333603

  •  26-10-2019
  •  | 
  •  

Вопрос

Я размещаю библиотеку .NET в своей программе C ++, используя следующие методы, хотя и не исчерпывающий список:

CorBindToRuntimeEx()
GetDefaultDomain()
CreateInstance()
GetIDsOfNames()

И в конце концов звонок Invoke().

Это работает достаточно хорошо, но я протекаю память всякий раз, когда функция .NET возвращает массив, например:

public int[] getArray() { int[] i = { 0, 1, 2, 3 }; return i; }

В этом случае функция возвращает VARIANT типа VT_SAFEARRAY|VT_I4. Анкет я пытался delete а также delete[] как на дескрипторе, так и на члене PvData, и это всегда терпит неудачу. Я пытался SafeArrayDestroy() дескриптор, который преуспевает, но развращает кучу. я могу позвонить SafeArrayDestroyData() на variant.parray->pvData что работает нормально, но SafeArrayDestroyDescriptor() снова повреждает кучу. Я все еще протекаю дескрипторы массива.

Итак, как я могу разобраться с дескриптором Safearray и подключить эту утечку памяти?

Это было полезно?

Решение

Невозможно угадать, не видя кода. Куча могла быть повреждена задолго до этого.

Вы должны использовать VariantClear ().

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top