gpt4 book ai didi

.NET 垃圾收集器

转载 作者:行者123 更新时间:2023-12-04 06:50:52 25 4
gpt4 key购买 nike

写在链接http://msdn.microsoft.com/en-us/magazine/bb985010.aspx

“当应用程序创建一个新对象时,new 运算符从堆中分配内存。如果对象的类型包含 Finalize 方法,则指向该对象的指针被放置在终结队列中。”

有人可以澄清一下吗

1)这意味着,只有当我们显式使用finalize(使用析构函数)时,对象才会进入finalize队列。

2)每个 .NET 类都隐式使用 finalize(使用析构函数),因此所有 .net 类库对象都将进入 finalize 队列。

3)我们的自定义类怎么样
A类
{
}
A 类 obj 将最终确定与否,同时考虑两种情况(显式/隐式析构函数)

4)如果上面的类是用非托管代码编写的,会发生什么。它将进入终结队列

谢谢

最佳答案

1) 是的,实现 Finalize() 方法的对象(C# 中的“析构函数”)被添加到 finalize-queue。

2) 不,大多数 .NET 类没有终结器。当您没有在您的类中实现一个时,该类的实例将不会添加到 finalize 队列中。

3) 你的 A 类只有在实现为 Finalize-Method 时才会进入 finalize-queue。 (C# 中的“析构函数”

4) 非托管类不受管理。不会被垃圾收集,也不会添加到 finalize-queue 中。

一些一般性说明。

  • C# 中的“析构函数”不是 C++ 意义上的析构函数。当它被调用时,你没有被授权者等等。它用于编写终结器方法的语法糖。
  • 避免使用终结器,因为它们会增加额外的开销。首先,必须将对象添加到 finalize 队列中。然后它必须被垃圾收集两次。第一次发现已经不用了。终结器方法完成的第二次。
  • 使用 IDisposable 接口(interface)来管理和释放资源。尤其是原生资源。
  • 仅将终结器用于 native 资源的“紧急清理”。基本上,您检查对象是否正确处置(IDisposable)-interace。如果没有,您在终结器中执行该工作以防止进一步的资源泄漏。
  • 关于.NET 垃圾收集器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3157445/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com