RAD Studio 10.3 Rio
Без рубрики
Итак, 21.11.2018 был выпущен релиз RAD Studio 10.3 Rio. Следует отметить несколько интересных моментов, связанных с этим релизом. В связи с этим я решил сделать
RAD Studio 10.3 Rio
Александр Божко
Итак, 21.11.2018 был выпущен релиз RAD Studio 10.3 Rio. Следует отметить несколько интересных моментов, связанных с этим релизом. В связи с этим я решил сделать
Как однажды ядро Windows пыталось противостоять гамма-лучам, разрушающим кэш процессора
Александр Алексеев
Это перевод For a brief period, the kernel tried to deal with gamma rays corrupting the processor cache. Автор: Реймонд Чен.
Однажды вот такой код был
Список из рекордов на коленке
Семен Хмелев
Честно подсмотрено.
THeader = record
x,y,z: TMyRecordField;
NextLabel: packed record end;
end;
На сколько прекрасно, на столько и отвратительно. Но восхищает однозначно хотя бы тем, что это вообще
Парное_программирование VS ревью_кода
Семен Хмелев
Данная заметка — реакция на статью http://alexnesterov.com/code-review/, где практика code review рассматривается как антипаттерн, а парное программирование как способ решить задачи ревью кода правильно. Конечно же, у парного программирования
Delphi Notes Splitter обновлён (v1.11)
Николай Зверев
Начало.
Версия 1.07.
Версия 1.08.
Версия 1.09.
Версия 1.10.
Текущая версия 1.11 доступна на gitub’е, в новой версии:
+ Добавлена поддержка VCL стилей
Что случилось со шрифтом Arial Unicode MS?
Александр Алексеев
Это перевод What happened to the Arial Unicode MS font? Автор: Реймонд Чен.
Клиент хотел узнать, что случилось со шрифтом Arial Unicode MS. Раньше он устанавливался
Ответ на задачку №24
Александр Алексеев
Ответ на задачку №24.
Задачка была про «чистое» и «грязное» завершение работы программы. Иногда я вижу такую классификацию:
TerminateProcess— самое «грязное» завершение работы процесса. Процесс и потоки убиваются сразу. Код очистки (финализация DLL) не выполняется.ExitProcess— более «правильное» завершение процесса. Выполняется код очистки DLL.Halt— аналогExitProcessв RTL языка. Дополнительно выполняет очистку RTL (финализация модулей и др.).Application.Terminate— заменаHaltдля приложений на VCL (с циклом выборки сообщений). Стоит немного отдельно, так как не выполняет немедленного завершения процесса. Зато позволяет провести более полную очистку (финализация форм и т.п.).
С этой точки зрения Halt выглядит предпочтительнее ExitProcess и уж тем более — TerminateProcess. И если приложение не использует VCL, то может показаться, что это — даже и правильное завершение процесса.
Тем не менее, в указанном коде есть одна явная и одна потенциальная проблемы.
Начнём со слона в комнате: Halt выполняет немедленное завершение программы — что означает, что никакой код после Halt не выполняется. В том числе — и очистка строки S. Это означает, что в этом коде — утечка памяти. Это и был вопрос задачки.
Да, это может не иметь значения на практике, поскольку вся память процесса будет освобождена ОС при выходе. Тем не менее, она будет определена как утечка любым отладочным инструментом для поиска утечек памяти. Иными словами, её нужно устранить.
Второй проблемы может и не быть в конкретно взятой программе (т.е. к задачке это отношения уже не имеет), но потенциально она возникнуть может (и легко). Надо иметь в виду, что Halt не выполняет полную (читай: «правильную») очистку, поскольку любые вышестоящие блоки finally не выполняются. Зато Halt выполняет секции finalization ваших модулей. С точки зрения программы у неё «волшебным» образом при выполнении оказываются пропущенными блоки кода. В частности, в пропущенных блоках может стоять финализация фоновых потоков. Т.е. при использовании Halt фоновые потоки будут всё ещё выполняться — что может оказаться неожиданным для кода очистки из секций finalization. Т.е. открываются широкие возможности для блокировок, ошибок доступа и т.п.
Мораль истории: не используйте Halt и ExitProcess. Если вам нужно чисто выйти из процесса, то нужно сделать это «естественным» способом — просто закончить выполнение главной процедуры основного потока. Чтобы перейти к её концу из произвольного места, можно использовать Exit и/или Abort (с подходящей конструкцией обработки на верхнем уровне).
А если вам нужно экстренно завершить процесс, то используйте TerminateProcess.

