Подтвердить что ты не робот

Почему мы используем Finalization в Units?

Я хотел бы знать, ПОЧЕМУ мы используем "Финализацию", если мы хотим что-то уничтожить при закрытии приложения? не закрывает приложение, освобождает все объекты напрямую, не вызывая.

Спасибо.

4b9b3361

Ответ 1

Не закрывает приложение, освобождает все объекты напрямую, не вызывая Free?

Нет. Экземпляры класса Delphi не собирают мусор, поэтому их нужно вручную уничтожить.

Однако, если вы говорите об исполняемом процессе, то вполне приемлемо не распоряжаться определенными объектами, так как операционная система будет повторно требовать все ресурсы, принадлежащие процессу, когда этот процесс завершается. Поэтому, несмотря на то, что деструкторы Delphi не запускаются, ОС прибирает все, когда процесс завершается. Невозможно протекание каких-либо системных ресурсов после его завершения.

Обратите внимание, что если устройство включено в DLL или пакет, тогда отказ уничтожить все объекты во время доработки приведет к утечке памяти, если эта DLL будет повторно загружена и выгружена в один процесс.

Если вы знаете, что ваш код только когда-либо запускается в исполняемом файле, тогда чувствуйте себя свободным не до объектов Free во время завершения. Имейте в виду, что если вы используете инструмент обнаружения утечки памяти, то это приведет к тому, что ваш намеренно просочившийся объект будет рассматриваться как утечка памяти. С этим справитесь, позвонив RegisterExpectedMemoryLeak.

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

Ответ 2

Добавление к последней точке ответа Дэвида Хеффермана: есть другие ресурсы, которые, возможно, необходимо будет освободить правильно, например обработчики файлов, которые генерируют контрольную сумму или какое-либо оборудование, подключенное к ПК, которое должно быть помещено в определенное состояние (например, лазер, который должен быть выключен, с которым я сейчас работаю).