考虑以下代码:
public class Class1
{
public static int c;
~Class1()
{
c++;
}
}
public class Class2
{
public static void Main()
{
{
var c1=new Class1();
//c1=null; // If this line is not commented out, at the Console.WriteLine call, it prints 1.
}
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine(Class1.c); // prints 0
Console.Read();
}
}
Run Code Online (Sandbox Code Playgroud)
现在,即使main方法中的变量c1超出范围并且在GC.Collect()调用时没有被任何其他对象进一步引用,为什么它没有在那里完成?
当执行行超出代码块之外时,变量会发生什么?例如:
1 public void myMethod()
2 {
3 int number;
4 number = 5;
5 }
Run Code Online (Sandbox Code Playgroud)
因此,我们声明并设置变量。当它超出代码块(第5行)时,变量号发生了什么?
这是创建类实例的另一个示例:
7 public void myMethod()
8 {
9 Customer myClient;
10 myClient = new Customer();
11 }
Run Code Online (Sandbox Code Playgroud)
当它超出代码块(第11行)时,对象引用myClient会发生什么?
我猜这两种情况都分配了变量,但是何时将其释放呢?
我直接从托管语言开始,几乎没有使用 C++ 的经验,因此这个问题可能太基本了。
在像 .net 这样的托管语言中,GC 会释放内存。从我读到的内容来看,在 C++ 中,这是通过调用 delete 来完成的。但是释放内存有什么作用呢?它是否将内存位置的所有位都设置为零?或者它是否以其他方式告诉操作系统该内存可用于重用?
更新:我以前经历过这个,我知道 GC 做什么。但这不是我的问题。我不是要问 GC 是如何工作的。我想理解的是,你如何判断一些内存是空闲的?