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

时间:2017-07-27 11:01:37

标签: c# arrays memory

在下面的代码中,myArray在第二行重新分配后最初指向的内存会发生什么?这个内存丢失了,还是C#垃圾收集器会处理它?<​​/ p>

dense_tensor_hack

就我一直在阅读而言,没有办法明确释放内存,所以我希望C#自动完成它。

2 个答案:

答案 0 :(得分:3)

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

如果稍微更改程序以创建对同一数组的第二个引用,就像这样

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

垃圾收集器释放该对象,只要对您的程序仍然可以访问它。

*有时您的程序在垃圾收集器完成其分析之前完成执行。但是,内存仍然会被释放。

答案 1 :(得分:2)

当你的变量超出范围并且不再需要内存时,它就有资格进行垃圾收集。

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

  

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

     

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

     
      
  1. 创建对象时,会为其分配内存,运行构造函数,并将对象视为实时。
  2.   
  3. 如果对象或其任何部分无法通过任何可能的继续执行来访问,除了运行   析构函数,该对象被认为不再使用,它​​变成了   有资格获得破坏。 C#编译器和垃圾收集器   可以选择分析代码以确定对对象的引用   可能会在将来使用。例如,如果是局部变量   范围是对象的唯一现有引用,但是本地引用   变量永远不会在任何可能的延续中被引用   从程序中的当前执行点执行,   垃圾收集器可以(但不是必须)将对象视为否   使用时间更长。
  4.   
  5. 一旦该对象有资格销毁,在某些未指定的时间后,析构函数(第10.12节)(如果有的话)为   对象运行。除非被显式调用覆盖,否则析构函数为   该对象仅运行一次。
  6.   
  7. 一旦运行了对象的析构函数,如果该对象或其任何部分无法通过任何可能的继续访问   执行,包括运行析构函数,对象是   被认为无法访问且该对象符合条件   集合。
  8.   
  9. 最后,在对象符合收集条件后的某个时间,垃圾收集器释放与之关联的内存   那个对象。
  10.   

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

或者我相信你也可以在这个主题上找到一些博客。