Вопрос достаточно прост для объяснения, и спор вокруг этого вопроса более субъективен, чем объективный. Использование FreeAndNil просто не нужен, если переменная ссылка на объект Освободившись будет выходить за рамки:
procedure Test;
var
LObj: TObject;
begin
LObj := TObject.Create;
try
{...Do work...}
finally
//The LObj variable is going out of scope here,
// so don't bother nilling it. No other code can access LObj.
//FreeAndNil(LObj);
LObj.Free;
end;
end;
В приведенном выше фрагменте кода, nilling переменная LObj
будет бессмысленным, по причине, указанной. Однако, если объектная переменная может быть создана и освобождена несколько раз за время жизни приложения, тогда возникает необходимость проверить, действительно ли объект создан или нет. Простой способ проверить это: установлена ли ссылка на объект nil
. Чтобы облегчить эту настройку до nil
, метод FreeAndNil()
освободит ресурсы и установит для вас nil
.Затем в коде вы можете проверить, не создается ли объект с LObj = nil
или Assigned(LObj)
.
Случай ли использовать .Free
или FreeAndNil()
в объектно-деструкторах серая зона, но по большей части, .Free
должны быть безопасными и nilling ссылки на подобъекты в деструкторе должен быть ненужным. Существуют различные аргументы в отношении того, как справляться с исключениями в конструкторах и деструкторах.
Теперь обратите внимание: если вы предпочитаете выбирать, использовать ли .Free
или FreeAndNil()
в зависимости от конкретных обстоятельств, описанных выше, это хорошо, но обратите внимание, что стоимость ошибки из-за не nilling освобожденной ссылки на объект который впоследствии доступен, может быть очень высоким. Если после этого указатель будет доступен (объект освобожден, но ссылка не установлена на нуль), может случиться, что вам не повезло, и обнаружение повреждения памяти приводит к тому, что многие строки кода удалены от доступа к ссылке на освобожденный, но невозвратный объект. Эта ошибка может занять очень много времени, и да, я знаю, как использовать FastMM.
Поэтому для некоторых людей, в том числе и для меня, это стало привычкой (возможно, ленивым), чтобы просто опустить все указатели на объекты, когда они освобождаются, даже когда наложение не является абсолютно необходимым.
Вы задали хороший вопрос здесь. – Ampere