繁体   English   中英

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

[英]Garbage Collection in C++/CLI, C# Mixed Code

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

一切都在照顾。 无论您是运行C#还是C ++ / CLI或任何其他.NET语言,它都是在同一个运行时执行的相同运行时 因此,两者都可以获得相同的GC。

当您使用gcnew ,您使用了运行时的托管内存分配器。 如果您在C ++ / CLI中使用new与非托管数组,则必须在之后使用delete[]运算符将其delete[]

C#中的垃圾收集对托管资源是自动的,因此您不必担心它们。 我没有很多C ++经验,但从我看到你使用的是Managed C ++

.NET Framework的垃圾收集器管理应用程序的内存分配和释放。 每次创建新对象时,公共语言运行库都会从托管堆中为对象分配内存。 只要托管堆中的地址空间可用,运行时就会继续为新对象分配空间。 但是,记忆并不是无限的。 最终垃圾收集器必须执行一个集合才能释放一些内存。 垃圾收集器的优化引擎根据正在进行的分配确定执行收集的最佳时间。 当垃圾收集器执行集合时,它会检查托管堆中不再被应用程序使用的对象,并执行必要的操作来回收其内存。

MSDN源垃圾收集

你应该只关注非托管资源。(对于C#,他们继承了IDisposable,你应该调用Dispose()方法,对于C ++调用delete [],如@Lucas提到的)。

您也可以检查这个问题: C#和C ++ / CLI对象的垃圾收集

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM