Search code examples
.netcom-interopsafearray

How can I delete a SAFEARRAY returned from a .NET function in native code?


I'm hosting a .NET library in my C++ program using the following methods, though not an exhaustive list:

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

And eventually a call to Invoke().

This works well enough, but I'm leaking memory whenever a .NET function returns an array, such as:

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

In this case, the function returns a VARIANT of type VT_SAFEARRAY|VT_I4. I've tried delete and delete[] on both the descriptor and pvData member, and this always fails. I've tried to SafeArrayDestroy() the descriptor, which succeeds but corrupts the heap. I can call SafeArrayDestroyData() on variant.parray->pvData which works fine, but SafeArrayDestroyDescriptor() again corrupts the heap. I'm still leaking the array descriptors.

So, how can I deallocate the SAFEARRAY descriptor and plug this memory leak?


Solution

  • Impossible to guess without seeing code. The heap might have been corrupted long before anyway.

    You should use VariantClear().