在下面的代码中,myArray在第二行重新分配后最初指向的内存会发生什么?这个内存丢失了,还是C#垃圾收集器会处理它?</ p>
dense_tensor_hack
就我一直在阅读而言,没有办法明确释放内存,所以我希望C#自动完成它。
答案 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#采用自动内存管理,使开发人员无需手动分配和释放对象占用的内存。
自动内存管理策略由垃圾实现 集电极。对象的内存管理生命周期为 如下:
- 创建对象时,会为其分配内存,运行构造函数,并将对象视为实时。
- 如果对象或其任何部分无法通过任何可能的继续执行来访问,除了运行 析构函数,该对象被认为不再使用,它变成了 有资格获得破坏。 C#编译器和垃圾收集器 可以选择分析代码以确定对对象的引用 可能会在将来使用。例如,如果是局部变量 范围是对象的唯一现有引用,但是本地引用 变量永远不会在任何可能的延续中被引用 从程序中的当前执行点执行, 垃圾收集器可以(但不是必须)将对象视为否 使用时间更长。
- 一旦该对象有资格销毁,在某些未指定的时间后,析构函数(第10.12节)(如果有的话)为 对象运行。除非被显式调用覆盖,否则析构函数为 该对象仅运行一次。
- 一旦运行了对象的析构函数,如果该对象或其任何部分无法通过任何可能的继续访问 执行,包括运行析构函数,对象是 被认为无法访问且该对象符合条件 集合。
- 最后,在对象符合收集条件后的某个时间,垃圾收集器释放与之关联的内存 那个对象。
醇>
如果您想了解更多细节,可以查看此处:https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/index
或者我相信你也可以在这个主题上找到一些博客。