SASGIS - SAS.Планета
View Issue Details
0003455SAS.ПланетаРефакторингpublic13-06-2019 07:3328-04-2020 09:35
vdemidov 
 
nonetrivialN/A
newopen 
181221 
 
0003455: Упорядочить удаление объектов по FreeAndNil и просто .Free
В продолжении дискуссии по поводу правильного способа удаления объектов. Нужно ли применять FreeAndNil или достаточно просто вызова .Free

Аргументация за FreeAndNil https://www.gunsmoker.ru/2009/04/freeandnil-free.html
Вот еще ссылочка на дискуссию http://programmingmindstream.blogspot.com/2014/01/freeandnil.htm

Ну а вот аргументация против http://www.nickhodges.com/post/Using-FreeAndNil.aspx
Мое мнение использовать простое правило: Для удаления локальных переменных достаточно просто вызвать .Free, если нет обязательной необходимости в занулении. Для полей класса - вызывать FreeAndNil.

Просто формулируется. Просто проверяется. Даже обычным поиском с RegExp по исходникам проекта.

Текущее состояние:

Free для полей класса - 13 вызовов.
FreeAndNil для полей класса - 340 вызовов.
Free для локальных переменных - 401 - вызовов
FreeAndNil для локальных переменных - 52 вызовов

Числа примерные, но видно что в принципе предложенное правило в общем соблюдается.

У Zed есть возражение против излишнего применения FreeAndNil для всех полей класса, но как я понимаю нет возражений, против того что бы для локальных переменных использовать просто .Free
No tags attached.
Issue History
13-06-2019 07:33vdemidovNew Issue
28-04-2020 08:54zedNote Added: 0019800
28-04-2020 09:03vdemidovNote Added: 0019801
28-04-2020 09:06zedNote Added: 0019802
28-04-2020 09:35vdemidovNote Added: 0019803

Notes
(0019800)
zed   
28-04-2020 08:54   
Просто в тему: в Delphi 10.4 они изменили сигнатуру FreeAndNil.

было: procedure FreeAndNil(var Obj);

стало: procedure FreeAndNil(const [ref] Obj: TObject); inline;
(0019801)
vdemidov   
28-04-2020 09:03   
И что это значит? Она перестала занлулять переменную?
(0019802)
zed   
28-04-2020 09:06   
Не перестала, просто они осознали, что старая версия приводила к багам, т.к. не было проверки типа.
(0019803)
vdemidov   
28-04-2020 09:35   
Аааа. Точно. И это хорошо. Это правильно :)