如何删除本机代码中从.NET函数返回的SAFEARRAY?

时间:2011-03-17 00:52:45

标签: .net com-interop safearray

我使用以下方法在我的C ++程序中托管.NET库,但不是详尽的列表:

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

最后打电话给Invoke()

这很好用,但是每当.NET函数返回一个数组时我就会泄漏内存,例如:

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

在这种情况下,函数返回VARIANT类型VT_SAFEARRAY|VT_I4。我在描述符和pvData成员上都尝试了deletedelete[],这总是失败。我试过SafeArrayDestroy()描述符,它成功但破坏了堆。我可以在SafeArrayDestroyData()上调用variant.parray->pvData,但工作正常,但SafeArrayDestroyDescriptor()会再次破坏堆。我还在泄漏数组描述符。

那么,我如何解除分配SAFEARRAY描述符并插入内存泄漏?

1 个答案:

答案 0 :(得分:2)

没有看到代码就无法猜测。无论如何,堆可能早就被破坏了。

您应该使用VariantClear()。