我有一个带有以下签名的假设COM对象
void MemAlloc(ref double[] test, int membercount)
使用new/malloc在C++中分配内存的地方.一旦这是在C#中,使用RCW,我如何确保正确释放内存?我认为.NET很难释放,考虑到在C++中你需要知道它是否已经分配了new/malloc/mm_malloc才能正确释放它.那么,清理我的C++分配数组的合适方法是什么?谢谢.
我相信您应该将CoTaskMemAlloc()用于您希望从托管端明确释放的内存.一旦不再可用,CLR将负责释放内存.如果要明确释放它,可以使用托管的Marshal.CoTaskFree()例程.
一般来说,interop marshaler和CLR遵守COM约定来释放内存; 收件人负责释放记忆.因此,如果将内存返回给托管调用方,CLR/Interop封送程序通常会处理释放本机调用中分配的内存.
从与互操作封送内存管理(MSDN):
interop marshaler总是尝试释放由非托管代码分配的内存.此行为符合COM内存管理规则,但不同于管理本机C++的规则.
如果您在使用平台调用时预期本机C++行为(无内存释放)会产生混淆,平台调用会自动释放指针内存.例如,从C++ DLL调用以下非托管方法不会自动释放任何内存.
运行时始终使用CoTaskMemFree方法释放内存.如果您使用的内存未使用CoTaskMemAlloc方法分配,则必须使用IntPtr并使用适当的方法手动释放内存.
将其包装在实现IDisposable的对象中,并确保C#包装器被释放.
这是我写的关于实现IDisposable的简单方法的博客.