Как я могу удалить SafeArray, возвращаемый из функции .NET в собственном коде?
-
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 ().