C ++ / CLI中的垃圾收集,C#混合代码

时间:2016-08-06 09:09:38

标签: c# garbage-collection c++-cli

我通过引用从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中分配了一个新内存,之前的引用丢失了,应该由垃圾收集处理。该程序没有显示任何内存泄漏。我是否需要以任何其他方式处理这种情况?

2 个答案:

答案 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提到的那样)。

您也可以查看此问题: Garbage Collection Across C# and C++/CLI Objects