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

标签 c# .net destructor

如果应用程序崩溃,是否会调用析构函数?如果这是一个未处理的异常,我猜是这样,但是更严重的错误,或者诸如用户终止应用程序进程之类的错误呢?

还有一些潜在的愚蠢问题:

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

最佳答案

我鼓励您亲自尝试一下。例如:

using System;

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

在命令提示符下运行它,这样您就可以看到最后的喘息。首先注释掉 throw 语句。

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

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

关于c# - 析构函数 - 如果应用程序崩溃,它会被调用吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2514688/

相关文章:

c++ - "= default"析构函数和空析构函数有什么区别?

C# 正则表达式帮助 - 验证输入

c# - Config.GetSection<T> 具有无效的类属性名称

c# - 将日期时间转换为时间

c# - 带有返回 null 的简单注入(inject)器的 ASP.NET Core 2.1 服务定位器

c++ - 析构函数抛出异常

c# - 挣扎于线程?

c# - 在并行端口上使用 SetCommTimeouts 失败

c# - 如何使用Dockerfile覆盖ASP.NET Core连接字符串

c++ - 为什么类的析构函数被调用两次?