在C#中重新分配数组时,内存会发生什么变化



在下面的代码中,myArray最初指向的内存在第2行重新分配后会发生什么?是内存丢失了,还是由C#垃圾收集器处理?

static void Main(string[] args)
{
double[] myArray = new Double[10];
myArray = new Double[3];
}

就我所读的内容而言,没有办法明确地释放内存,所以我希望C#能自动释放

当然,C#会自动释放分配之前与myArray关联的内存。这种情况不会立即发生,但一旦垃圾收集器意识到没有对Double[10]数组对象*的剩余引用,分配给该对象的内存就会被回收。

如果您稍微更改程序以创建对同一数组的第二个引用,如以下

double[] myArray = new Double[10];
double[] myArray2 = myArray; // Second reference
myArray = new Double[3];

只要程序仍然可以访问对对象的引用,垃圾收集器就不会释放对象。

*有时,程序在垃圾收集器完成分析之前就完成了执行。不过,内存仍然会被释放。

当变量超出范围并且不再需要内存时,它就可以进行垃圾收集。

MS解释了所有内容,如下所示:https://msdn.microsoft.com/en-us/library/aa691138(v=vs.71).aspx

C#采用了自动内存管理,使开发人员无需手动分配和释放对象占用的内存。

自动内存管理策略由垃圾实现收集器。对象的内存管理生命周期如下如下:

  1. 创建对象时,将为其分配内存,运行构造函数,并将对象视为活动对象
  2. 如果除了运行析构函数,对象被认为不再使用有资格销毁。C#编译器和垃圾收集器可以选择分析代码以确定对对象的哪些引用可以在将来使用。例如,如果in scope是对对象的唯一现有引用,但该本地引用在的任何可能的延续中都不会引用变量从过程中的当前执行点执行垃圾收集器可以(但不是必须的)将对象视为no使用时间更长
  3. 一旦对象符合销毁条件,则在某个未指定的稍后时间对象正在运行。除非被显式调用重写,否则的析构函数该对象只运行一次
  4. 一旦运行了对象的析构函数,如果该对象或其任何部分无法通过执行,包括运行析构函数,对象是被认为是不可访问的,并且对象符合收集
  5. 最后,在对象符合收集条件后的某个时间,垃圾收集器释放与那个物体

如果您想了解更多详细信息,可以查看此处:https://learn.microsoft.com/en-us/dotnet/standard/garbage-collection/index

或者我相信你也可以找到一些关于这个话题的博客。

最新更新