Как я могу удалить SAFEARRAY, возвращенный из функции .NET в нативный код? - PullRequest
2 голосов
/ 17 марта 2011

Я размещаю библиотеку .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 и устранить эту утечку памяти?

1 Ответ

2 голосов
/ 17 марта 2011

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

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

...