Destructor - вызывает вызов, если приложение вылетает
Вызывается вызов деструктора при сбое приложения? Если это необработанное исключение, я предполагаю, что это так, но как насчет более серьезных ошибок или что-то вроде пользователя, убивающего процесс приложения?
И еще несколько потенциально немых вопросов:
- что происходит со всеми объектами в приложении, когда приложение выходит, и все финализаторы были выполнены - объекты собирают мусор, или они каким-то образом "разгружаются" процессом или апдоменом?
- - часть сборщика мусора каждого приложения (работает в том же процессе) или независима?
Ответы
Ответ 1
Я бы посоветовал вам попробовать это для себя. Например:
using System;
class Program {
static void Main(string[] args) {
var t = new Test();
throw new Exception("kaboom");
}
}
class Test {
~Test() { Console.WriteLine("finalizer called"); }
}
Запустите это в командной строке, чтобы вы могли увидеть последний вздох. Сначала с выражением о выбросе прокомментировано.
Как и любое необработанное исключение в Windows, фильтр исключений по умолчанию, который предоставляет Windows, вызывает диалоговое окно "Отчет об ошибках Windows", отображаемое WerFault.exe. Если вы нажмете "Закрыть программу", WerFault будет использовать TerminateProcess(), чтобы убить программу. Это быстрый конец, нет возможности запустить поток финализатора, как это происходит, когда программа завершается нормально.
Затем Windows заботится о очистке осколков. Он автоматически закрывает любую операционную систему, которую может открыть ваша программа, но не удалось закрыть финализатор. Файлы здесь сложнее, их буферы не очищаются, и вы легко получите частично записанный файл на диске.
Ответ 2
Я даже не знаю С#, но, основываясь на своих опытах с другими языками программирования, я бы предположил: если приложение выйдет из строя, это значит, что с ним что-то серьезно не так. Неправильная обработка памяти и т.д. Для любого языка программирования было бы странно пытаться выполнить деструкторы/деллалокаторы/финализаторы/... в таком случае. Вещи, вероятно, просто будут более ошибочными;)
Обновление: (забыл попробовать ответить на другие вопросы) снова, а не на С# -специфическом, но, как правило, нет гарантии, что деструкторы/деллалокаторы/финализаторы/... действительно будут вызваны. Причина этого в том, что, когда процесс завершается, гораздо проще и эффективнее просто "защемить" блок памяти, используемый для процесса, чем запустить его деструкторы и т.д., Чтобы очистить память.
Я не уверен, как ответить на ваш последний вопрос, не вдаваясь в слишком много технических деталей. Существует несколько способов, с помощью которых сборщики мусора можно создавать и запускать, проще всего то, что сбор мусора останавливает текущий процесс и продолжает его, когда это делается, хотя также возможно (но сложнее) иметь сборщиков мусора, которые работают одновременно с процессами, память которых они собирают.
Возможно, вы захотите ознакомиться с теорией сбора мусора, чтобы лучше понять все это. На самом деле есть целый сайт только по этой теме: www.memorymanagement.org.
Ответ 3
Если вы убили приложение, приложение почти на 100% потеряло бы контроль сразу, и нет никакой возможности вызвать его деструктор.