当前位置: 首页 > 编程语言 > C#

析构函数——应用程序崩溃时会被调用吗?Share

时间:2023-04-10 15:32:06 C#

Destructor-如果应用程序崩溃,它会被调用吗?如果应用程序崩溃,是否会调用析构函数?如果它是一个未处理的异常,我猜它是,但是更严重的错误,或者用户终止应用程序进程什么的呢?还有一些可能很愚蠢的问题:我鼓励你自己尝试一下。例如:使用系统;类程序{staticvoidMain(string[]args){vart=newTest();抛出新的异常(“kaboom”);}}classTest{~Test(){Console.WriteLine("finalizercalled");}}在命令提示符下运行它,这样你就可以看到最后的喘息。先把throw语句注释掉。对于Windows中任何未处理的异常,Windows提供的默认异常过滤器会调用WerFault.exe显示的Windows错误报告对话框。如果单击“关闭程序”,WerFault将使用TerminateProcess()终止程序。这是一个快速结束,没有机会运行终结器线程,就像程序正常退出时一样。Windows然后负责清理弹片。它会自动关闭程序可能已打开的任何操作系统句柄,但没有机会在终结器中关闭它们。文件是这里比较棘手的问题,它们的缓冲区没有刷新,你可以很容易地在磁盘上找到部分写入的文件。我什至不知道C#,但根据我使用其他编程语言的经验,我猜:如果应用程序崩溃,则意味着它出现了严重问题。不正确的内存处理等。在这种情况下,任何编程语言尝试实现析构函数/解除分配器/终结器/......都会很奇怪。事情可能会更糟;)更新:(忘记尝试回答您的其他问题),不是特定于C#的,但通常不能保证实际调用了析构函数/解除分配器/终结器/...。这样做的原因是当一个进程退出时,简单地“删除”该进程使用的内存块比运行它的析构函数等来清理内存更容易和更有效。我不知道如何在不涉及太多技术细节的情况下回答您的最后一个问题。有几种方法可以设计垃圾收集器并使其运行,最简单的方法是让垃圾收集器停止当前进程并在完成后继续,尽管也有可能(但更难)让垃圾收集器与他们正在收集记忆过程的那些。您可能想阅读垃圾收集理论以更好地理解所有这些。实际上有一个关于这个主题的完整网站:http://www.memorymanagement.org。如果你杀死一个应用程序,这个应用程序几乎立即100%失控,它没有机会调用析构函数。以上就是C#学习教程:析构函数——如果应用程序崩溃了,会调用吗?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: