пятница, 26 апреля 2013 г.

Что я ещё обычно правлю в VCL и других сторонних библиотеках

Заменяю Free на FreeAndNil.

Понятно почему?

Обычный сценарий таков:


TA = class
private
 FField : TComponent;
protected
 procedure DoSomething;
 procedure DoSomething1; virual;
 destructor Destroy; override;
end;
 
TB = clas(TA)
protected
 procedure DoSomething1; override;
end;
 
 
destructor TA.Destroy;
begin
 FField.Free;
 DoSomething1;
 inherited;
end;
 
procedure TA.DoSomething;
begin
 if (FField <> nil) then
  FField.CallSomeMethod;
end;
 
procedure TA.DoSomething1;
begin
end;
 
procedure TB.DoSomething1;
begin
 DoSomething;
 inherited;
end;


-- никакой магии и никакого "хоккея" (http://18delphi.blogspot.com/2013/04/blog-post_8.html), но огребаем AV.

Посему - я обычно тупо беру FAR и Alt-F7. И тупо заменяю все Free на FreeAndNil. Хуже - уж точно не становится.

Update. Вот и обоснование - http://www.gunsmoker.ru/2009/04/freeandnil-free.html

И цитата оттуда:
"Заметьте, что речь идёт именно о замене Free на FreeAndNil везде. Не просто об использовании FreeAndNil, когда вы хотите проверять ссылку на nil, а именно - целиком и полностью везде. Т.е. не писать Free вообще никогда. Да, включая сценарии с локальными переменными.

Почему? Ну причина проста - нет никаких доводов так не делать (пожалуйста, дочитайте до конца). Зато есть доводы против использования Free в этих ситуациях."

Комментариев нет:

Отправить комментарий