¿Cómo puedo eliminar un safearray devuelto de una función .NET en código nativo?
-
26-10-2019 - |
Pregunta
Estoy alojando una biblioteca .NET en mi programa C ++ utilizando los siguientes métodos, aunque no una lista exhaustiva:
CorBindToRuntimeEx()
GetDefaultDomain()
CreateInstance()
GetIDsOfNames()
Y eventualmente una llamada a Invoke()
.
Esto funciona lo suficientemente bien, pero estoy filtrando memoria cada vez que una función .NET devuelve una matriz, como:
public int[] getArray() { int[] i = { 0, 1, 2, 3 }; return i; }
En este caso, la función devuelve un VARIANT
de tipo VT_SAFEARRAY|VT_I4
. He intentado delete
y delete[]
tanto en el descriptor como en el miembro de PVData, y esto siempre falla. He intentado SafeArrayDestroy()
El descriptor, que tiene éxito pero corrompe el montón. puedo llamar SafeArrayDestroyData()
en variant.parray->pvData
que funciona bien, pero SafeArrayDestroyDescriptor()
nuevamente corrompe el montón. Todavía estoy filtrando los descriptores de la matriz.
Entonces, ¿cómo puedo repartir el descriptor Safearray y enchufar esta fuga de memoria?
Solución
Imposible de adivinar sin ver código. El montón podría haberse corrompido mucho antes de todos modos.
Debe usar VariantClear ().