相关疑难解决方法(0)

了解.NET中的垃圾收集

考虑以下代码:

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()调用时没有被任何其他对象进一步引用,为什么它没有在那里完成?

.net c# garbage-collection

161
推荐指数
2
解决办法
5万
查看次数

可变寿命

当执行行超出代码块之外时,变量会发生什么?例如:

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# lifetime object-lifetime lifetime-scoping

4
推荐指数
1
解决办法
1193
查看次数

释放内存是什么意思?这是否意味着将所有位都设置为零?

我直接从托管语言开始,几乎没有使用 C++ 的经验,因此这个问题可能太基本了。

在像 .net 这样的托管语言中,GC 会释放内存。从我读到的内容来看,在 C++ 中,这是通过调用 delete 来完成的。但是释放内存有什么作用呢?它是否将内存位置的所有位都设置为零?或者它是否以其他方式告诉操作系统该内存可用于重用?

更新:我以前经历过这个,我知道 GC 做什么。但这不是我的问题。我不是要问 GC 是如何工作的。我想理解的是,你如何判断一些内存是空闲的?

memory-management

3
推荐指数
1
解决办法
1369
查看次数