当前位置:  开发笔记 > 编程语言 > 正文

C#清理C++分配的内存吗?

如何解决《C#清理C++分配的内存吗?》经验,为你挑选了2个好方法。

我有一个带有以下签名的假设COM对象

void MemAlloc(ref double[] test, int membercount)

使用new/malloc在C++中分配内存的地方.一旦这是在C#中,使用RCW,我如何确保正确释放内存?我认为.NET很难释放,考虑到在C++中你需要知道它是否已经分配了new/malloc/mm_malloc才能正确释放它.那么,清理我的C++分配数组的合适方法是什么?谢谢.



1> Arnshea..:

我相信您应该将CoTaskMemAlloc()用于您希望从托管端明确释放的内存.一旦不再可用,CLR将负责释放内存.如果要明确释放它,可以使用托管的Marshal.CoTaskFree()例程.

一般来说,interop marshaler和CLR遵守COM约定来释放内存; 收件人负责释放记忆.因此,如果将内存返回给托管调用方,CLR/Interop封送程序通常会处理释放本机调用中分配的内存.

从与互操作封送内存管理(MSDN):

interop marshaler总是尝试释放由非托管代码分配的内存.此行为符合COM内存管理规则,但不同于管理本机C++的规则.

如果您在使用平台调用时预期本机C++行为(无内存释放)会产生混淆,平台调用会自动释放指针内存.例如,从C++ DLL调用以下非托管方法不会自动释放任何内存.

运行时始终使用CoTaskMemFree方法释放内存.如果您使用的内存未使用CoTaskMemAlloc方法分配,则必须使用IntPtr并使用适当的方法手动释放内存.



2> plinth..:

将其包装在实现IDisposable的对象中,并确保C#包装器被释放.

这是我写的关于实现IDisposable的简单方法的博客.

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有