我通过引用从C#传递数组到C ++ / CLI以用作out参数。我的代码如下:
C#
ushort[] a = new ushort[1];
cppclr.method(ref a);
C ++ / CLI
void method(array<ushort>^% a)
{
a = gcnew array<ushort>(5);
a[0] = 1;
a[1] = 2;
a[2] = 3;
}
代码编译正常并且不会产生错误。但是,我很困惑我在C#中创建的数组是否由垃圾收集处理?我的困惑在于,由于我在C ++ / CLI中分配了一个新内存,之前的引用丢失了,应该由垃圾收集处理。该程序没有显示任何内存泄漏。我是否需要以任何其他方式处理这种情况?
答案 0 :(得分:3)
一切都在照顾。无论您是运行C#还是C ++ / CLI还是其他任何.NET语言,都可以在底层执行相同的运行时。因此,两者都得到相同的GC。
当您使用gcnew
时,您使用了运行时的托管内存分配器。如果您在C ++ / CLI中使用new
非托管数组,则必须在之后使用delete[]
运算符将其释放。
答案 1 :(得分:0)
C#中的垃圾收集对于托管资源是自动的,因此您不必担心它们。我没有C ++的丰富经验,但从我看到你使用的是托管C ++ 。
.NET Framework的垃圾收集器管理分配和 为您的应用程序释放内存。每次创建新的 对象,公共语言运行库为对象分配内存 来自托管堆。只要地址空间可用 托管堆,运行时继续为新对象分配空间。 但是,记忆并不是无限的。最终垃圾收集器必须 执行一个集合,以释放一些记忆。垃圾 收集器的优化引擎确定执行a的最佳时间 集合,基于正在进行的分配。当垃圾 collector执行集合,它检查托管中的对象 应用程序不再使用的堆并执行 必要的操作来回收他们的记忆。
MSDN Source Garbage Collection
你应该只关注非托管资源。(对于C#,他们继承了IDisposable,你应该调用Dispose()方法,对于C ++调用delete [],如@Lucas提到的那样)。