析构函数 - 如果应用程序崩溃,它会被调用吗?

ana*_*kic 17 .net c# destructor

如果应用程序崩溃,是否会调用析构函数?如果它是一个未处理的异常,我猜它确实存在,但是更严重的错误,或者类似用户杀死应用程序进程的事情呢?

还有一些可能是愚蠢的问题:

  • 当应用程序退出并且所有终结器都已执行时,应用程序中的所有对象会发生什么 - 对象是否被垃圾收集,或者它们是否以某种方式全部"卸载"了进程或应用程序域?
  • 是每个应用程序的垃圾收集器部分(在同一个进程中运行)还是独立的?

Han*_*ant 23

我鼓励你自己尝试一下.例如:

using System;

class Program {
  static void Main(string[] args) {
    var t = new Test();
    throw new Exception("kaboom");
  }
}
class Test {
  ~Test() { Console.WriteLine("finalizer called"); }
}
Run Code Online (Sandbox Code Playgroud)

在命令提示符下运行此命令,以便您可以看到最后一次喘息.首先将throw语句注释掉.

与Windows中任何未处理的异常一样,Windows提供的默认异常过滤器调用WerFault.exe显示的Windows错误报告对话框.如果单击"关闭程序",WerFault将使用TerminateProcess()来终止该程序.这是一个快速结束,没有机会运行终结器线程,就像程序正常退出时一样.

Windows然后负责清理弹片.它会自动关闭程序可能已打开的任何操作系统句柄,但没有机会在终结器中关闭.文件是这里比较棘手的问题,它们的缓冲区不会被刷新,你很容易在磁盘上找到部分写入的文件.