Рассмотрим следующую программу C #, я отправил ее на codegolf в качестве ответа на создание цикла без цикла:
class P{
static int x=0;
~P(){
System.Console.WriteLine(++x);
new P();
}
static void Main(){
new P();
}
}
На мой взгляд, эта программа выглядит как бесконечный цикл, но кажется, что она выполняется в течение нескольких тысяч итераций, а затем программа успешно завершается без ошибок (ошибок не возникает). Это нарушение спецификации, из-за которого финализатор в P
конечном итоге не вызывается?
Ясно, что это глупый код, который никогда не должен появиться, но мне любопытно, как программа может когда-либо завершиться.
Исходный код поста для гольфа :: /codegolf/33196/loop-without-looping/33218#33218
c#
garbage-collection
Майкл Б.
источник
источник
Ответы:
Согласно Рихтеру во втором издании CLR через C # (да, мне нужно обновить):
Стр. Решебника 478
Кроме того, как упоминает Серви, у него есть собственная ветка.
источник
Финализатор не работает в основном потоке. У финализатора есть собственный поток, который запускает код, и это не поток переднего плана, который будет поддерживать работу приложения. Основной поток эффективно завершается сразу же, и в этот момент поток финализатора просто запускается столько раз, сколько у него есть возможность, прежде чем процесс будет остановлен. Ничто не поддерживает работу программы.
источник
Сборщик мусора - это не активная система. Он запускается «иногда» и в основном по запросу (например, когда все страницы, предлагаемые ОС, заполнены).
Большинство сборщиков мусора работают в подпотоках в стиле первого поколения. В большинстве случаев переработка объекта может занять несколько часов.
Единственная проблема возникает, когда вы хотите прекратить работу программы. Однако это не проблема. При использовании
kill
ОС будет вежливо попросить прекратить процессы. Однако, когда процесс остается активным, можно использовать место,kill -9
где операционная система удаляет весь контроль.Когда я запустил ваш код в интерактивной
csharp
среде, я получил:Таким образом, ваша программа вылетает из-за того, что
stdout
она заблокирована терминологией среды.При удалении
Console.WriteLine
и убийстве программы. Через пять секунд программа завершится (другими словами, сборщик мусора откажется и просто освободит всю память без учета финализаторов).источник
P
экземпляра просто истек.