Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中重新分配数组时,内存会发生什么变化?_C#_Arrays_Memory - Fatal编程技术网

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

在C#中重新分配数组时,内存会发生什么变化?,c#,arrays,memory,C#,Arrays,Memory,在下面的代码中,myArray最初指向的内存在第2行重新分配后会发生什么情况?是内存丢失了,还是由C#垃圾收集器处理 static void Main(string[] args) { double[] myArray = new Double[10]; myArray = new Double[3]; } 据我所知,没有办法显式释放内存,所以我希望C#自动释放。当然,C#自动释放分配前与myArray关联的内存。这种情况不会立即发生,但一旦垃圾收集器意识到该Double[10]a

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

static void Main(string[] args)
{
   double[] myArray = new Double[10];
   myArray = new Double[3];
}
据我所知,没有办法显式释放内存,所以我希望C#自动释放。

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

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

double[] myArray = new Double[10];
double[] myArray2 = myArray; // Second reference
myArray = new Double[3];
垃圾收集器不会释放该对象,只要程序仍然可以访问该对象的引用

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

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

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

double[] myArray = new Double[10];
double[] myArray2 = myArray; // Second reference
myArray = new Double[3];
垃圾收集器不会释放该对象,只要程序仍然可以访问该对象的引用


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

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

MS解释了所有内容,如下所示:

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

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

  • 当对象被创建时,内存被分配给它,构造函数被运行,对象被认为是活动的
  • 如果对象或其任何部分不能通过任何可能的继续执行(运行 析构函数,则该对象被视为不再使用,并成为 有资格销毁。C#编译器和垃圾收集器 可以选择分析代码以确定对对象的引用 可能在将来使用。例如,如果一个局部变量 in范围是对对象的唯一现有引用,但该引用是局部的 变量在任何可能的 从过程中的当前执行点执行 垃圾收集器可以(但不是必须)将对象视为no 使用时间更长
  • 一旦该对象符合销毁条件,则在以后某个未指定的时间,该对象的析构函数(第10.12节)(如有) 对象已运行。除非被显式调用重写,否则 对象仅运行一次
  • 一旦某个对象的析构函数运行,如果该对象或其任何部分不能被任何可能的 执行,包括运行析构函数,对象是 视为不可访问,且对象符合 收藏
  • 最后,在对象符合收集条件后的某个时间,垃圾收集器会释放与对象关联的内存 那个物体
  • 如果您想了解更多细节,可以查看以下内容:


    或者,我相信您也可以找到一些关于该主题的博客。

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

    MS解释了所有内容,如下所示:

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

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

  • 当对象被创建时,内存被分配给它,构造函数被运行,对象被认为是活动的
  • 如果对象或其任何部分不能通过任何可能的继续执行(运行 析构函数,则该对象被视为不再使用,并成为 有资格销毁。C#编译器和垃圾收集器 可以选择分析代码以确定对对象的引用 可能在将来使用。例如,如果一个局部变量 in范围是对对象的唯一现有引用,但该引用是局部的 变量在任何可能的 从过程中的当前执行点执行 垃圾收集器可以(但不是必须)将对象视为no 使用时间更长
  • 一旦该对象符合销毁条件,则在以后某个未指定的时间,该对象的析构函数(第10.12节)(如有) 对象已运行。除非被显式调用重写,否则 对象仅运行一次
  • 一旦某个对象的析构函数运行,如果该对象或其任何部分不能被任何可能的 执行,包括运行析构函数,对象是 视为不可访问,且对象符合 收藏
  • 最后,在对象符合收集条件后的某个时间,垃圾收集器会释放与对象关联的内存 那个物体
  • 如果您想了解更多细节,可以查看以下内容:


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

    垃圾收集器会处理它。数据仍会在内存中保留一段时间。因为你不再有任何指向该数据的指针,