Не вызывается финализатор.
От: #John Европа https://github.com/ichensky
Дата: 29.11.18 11:56
Оценка:
Здравствуйте, почему в первом случае не вызывается финализатор?

using System;
using static System.Console;

namespace ConsoleApp4
{
    class FinalizableObject
    {
        ~FinalizableObject()
        {
            WriteLine(nameof(FinalizableObject));
        }
    }
    class Program
    {
        public static void func() {
            WriteLine(nameof(func));
            var a = new FinalizableObject() { };
        }

        static void Main(string[] args)
        {
            func();

            GC.Collect();
            GC.WaitForFullGCComplete();

            GC.Collect();
            GC.WaitForFullGCComplete();

            Console.Read();
        }
    }
}


Но во втором случае, финализатор вызывается ровно 1 раз как и положено.
class FinalizableObject
    {
        ~FinalizableObject()
        {
            WriteLine(nameof(FinalizableObject));
            Program.finalizableObject = this;
        }
    }
    class Program
    {
        public static FinalizableObject finalizableObject;

        public static void func() {
            WriteLine(nameof(func));
            var a = new FinalizableObject() { };
        }

        static void Main(string[] args)
        {
            func();

            GC.Collect();
            GC.WaitForFullGCComplete();

            GC.Collect();
            GC.WaitForFullGCComplete();

            Console.Read();
        }
Підтримати Україну у боротьбі з країною-терористом.

https://prytulafoundation.org/
https://u24.gov.ua/

Слава Збройним Силам України!!! Героям слава!!!
Re: Не вызывается финализатор.
От: alexzzzz  
Дата: 29.11.18 13:12
Оценка:
У меня в обоих случаях появляется строка "FinalizableObject". NET 4.7.2.
Отредактировано 29.11.2018 13:13 alexzzzz . Предыдущая версия .
Re: Не вызывается финализатор.
От: Mr.Delphist  
Дата: 29.11.18 13:14
Оценка:
Здравствуйте, #John, Вы писали:

J>Здравствуйте, почему в первом случае не вызывается финализатор?


Финализатор, вроде, вызывается после GC, причём недетерменированно, в отдельном треде. Т.е. может быть такое, что в первом случае он зовётся, но уже после разрушения основного класса, консоли, детача дебагера и всего такого. Во втором случае, у нас есть граф зависимостей, поэтому разрушить основной класс без финализации FinalizableObject — нельзя, и финализатор получается "наблюдаемым".
Re[2]: Не вызывается финализатор.
От: #John Европа https://github.com/ichensky
Дата: 29.11.18 13:24
Оценка:
Здравствуйте, Mr.Delphist, Вы писали:

MD>Финализатор, вроде, вызывается после GC, причём недетерменированно, в отдельном треде. Т.е. может быть такое, что в первом случае он зовётся, но уже после разрушения основного класса, консоли, детача дебагера и всего такого. Во втором случае, у нас есть граф зависимостей, поэтому разрушить основной класс без финализации FinalizableObject — нельзя, и финализатор получается "наблюдаемым".

Да, похоже надо вызывать метод GC.WaitForPendingFinalizers() , что бы точно убедиться что финализатор будет вызван.
Підтримати Україну у боротьбі з країною-терористом.

https://prytulafoundation.org/
https://u24.gov.ua/

Слава Збройним Силам України!!! Героям слава!!!
Re[2]: Не вызывается финализатор.
От: alexzzzz  
Дата: 29.11.18 13:27
Оценка: +2
Здравствуйте, Mr.Delphist, Вы писали:

MD>Во втором случае, у нас есть граф зависимостей, поэтому разрушить основной класс без финализации FinalizableObject — нельзя


FinalizableObject не зависит от Program.

Что-то я не вижу в примерах большой разницы, кроме той что во втором случае объекту FinalizableObject после отработки его финализатора будет подарена вторая жизнь.

--
Может быть, вместо

GC.Collect();
GC.WaitForFullGCComplete();

GC.Collect();
GC.WaitForFullGCComplete();


имелось в виду

GC.Collect();
GC.WaitForPendingFinalizers();

?
Отредактировано 21.12.2018 13:59 alexzzzz (грамматическая ошибка) . Предыдущая версия .
Re[2]: Не вызывается финализатор.
От: TK Лес кывт.рф
Дата: 19.12.18 19:46
Оценка:
Здравствуйте, Mr.Delphist, Вы писали:

MD>поэтому разрушить основной класс


вы в слово разрушить какой физический смысл вкладываете?
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[3]: Не вызывается финализатор.
От: Mr.Delphist  
Дата: 20.12.18 09:58
Оценка:
Здравствуйте, TK, Вы писали:

TK>Здравствуйте, Mr.Delphist, Вы писали:


MD>>поэтому разрушить основной класс


TK>вы в слово разрушить какой физический смысл вкладываете?


Какой-какой. До основанья! А затем...

Т.е. отмечаем, что данный блок памяти свободен, дёргаем системные API для возврата unmanaged-ресурсов, проходим по дереву связанных объектов и делаем там то же самое. По окончании — опциональный heap compaction, вот это всё.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.