【问题标题】:Managing Arrays in C# (Memory management)在 C# 中管理数组(内存管理)
【发布时间】:2017-02-07 09:07:06
【问题描述】:

我在 C 和 C++(没有 GC 的语言)方面有经验,但最近才经常使用 C#。我有一个问题,我想我已经得到了答案,但我希望有人确认我,或者纠正我(如果我错了)。

假设我有以下

int[,] g = new int[nx, ny];

很容易。这只是为 2D 整数数组分离内存。之后我可以使用它,只要我不超过 nx 或 ny 作为数组的限制。

现在,假设我想执行几次,但每次都使用不同的 nx 和 ny(如何计算这些新值并不重要)

所以我会这样做

int[,] g;

for(k=0;k<numberOfTimes;k++)
{
 //re-calculate nx and ny


 g = new int[nx, ny];

 //work with g


}

通常我会认为每次我为 g 分离内存时,我都会留下永远无法到达的泄漏内存。显然我将不得不“删除”这个。 但是既然C#有垃圾回收,我可以不受惩罚地做上面的吗??

换句话说,我上面的代码足够安全吗?

有什么更好的建议吗?

【问题讨论】:

  • 你做的很好。只需确保包含对该数组的引用(如果有)的任何非本地字段都设置为 null 或替换为对新数组的引用。如果你有一个引用数组的静态字段,显然内存将被保留,而该引用仍然可以访问。
  • 简短回答:除非您正在处理非托管资源或分配非常大的对象,否则您通常不必担心 C# 中的内存泄漏。

标签: c# memory-leaks garbage-collection


【解决方案1】:

您的代码足够安全。

GC 只收集堆上那些在堆栈上没有指向它们的引用的对象。在您的场景中,for 循环范围内的变量获得另一个引用,前一个数组丢失了对它的所有可用引用,因此在一段时间内被收集。

此外,不需要在外部范围内声明变量,因为它稍后会在编译时进行优化。更多相关信息:here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 2018-12-17
    • 2015-09-25
    • 2011-07-20
    • 1970-01-01
    相关资源
    最近更新 更多