Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2009.08.02;
Скачать: [xml.tar.bz2];

Вниз

FreeAndNil против Free. Интересная концепция.   Найти похожие ветки 

 
Игорь Шевченко ©   (2009-06-03 10:56) [120]

Юрий Зотов ©   (03.06.09 04:18) [119]


> Угу, совсем мимо. В унаследованном обработчике возникает
> исключение - и переменная не обнуляется. После чего вся
> логика летит совсем мимо. С непредсказуемыми результатами.
>


А с чего ему возникать ?


 
Юрий Зотов ©   (2009-06-03 11:32) [121]

> Игорь Шевченко ©   (03.06.09 10:56) [120]

С того, что [19]. Надо ведь быть последовательным в своих высказываниях, не так ли?


 
Игорь Шевченко ©   (2009-06-03 12:08) [122]

Юрий Зотов ©   (03.06.09 11:32) [121]

А я, собственно, вполне последователен. [19] относится к деструктору, спорный фрагмент - к событию формы. Почувствуйте разницу


 
Юрий Зотов ©   (2009-06-03 12:26) [123]

> Игорь Шевченко ©   (03.06.09 12:08) [122]

Угу. Только заметь, что в событии формы исключение даже более вероятно, чем в деструкторе. Потому что, как правило, есть заметная разница в классе програмистов, которые пишут события формы и деструкторы.

Почувствуйте разницу.


 
Игорь Шевченко ©   (2009-06-03 12:46) [124]

Юрий Зотов ©   (03.06.09 12:26) [123]

Юра, я тебе могу сказать еще раз - криворукий программист испортит программу таким способом (и не единственным, причем), против которого любая защита будет бессильна.

Есть предложение завершить дискуссию.


 
Юрий Зотов ©   (2009-06-03 13:39) [125]

> Игорь Шевченко ©   (03.06.09 12:46) [124]

То есть, нет никакого смысла закрывать криворукому программисту возможность нарушить работу программы. В таком случае надо быть последовательным: все члены всех классов помещаем в public, все методы делаем виртуальными, все объявления выносим в interface - пущай себе резвится.

Предложение принимается.


 
Игорь Шевченко ©   (2009-06-03 13:40) [126]


> В таком случае надо быть последовательным: все члены всех
> классов помещаем в public, все методы делаем виртуальными,
>  все объявления выносим в interface - пущай себе резвится.
>


Дурное дело нехитрое


 
Дмитрий Белькевич   (2009-06-04 12:00) [127]

Итак... Очередной баг с помощью FreeAndNil откопал. Что характерно, с локально созданным и разрушенным объектом. Рассказываю.

Использую компоненты TBX. Для их редактирования использую модуль TBXEdit.

Вызываю его так:


TBXSetUpEditForm([TBXToolbar1, TBXToolbar3], [], [TBXItem126], fRegistryKey, 0, True, True, False, False, {nil,}
 PngImageList1);
ToolbarEditForm := TToolbarEditForm.Create(Self);
try
 ToolbarEditForm.ShowModal;
finally
 FreeAndNil(ToolbarEditForm);
end;


После изменения на FreeAndNil появилось AV при закрытии формы. Смотрим почему.

ToolbarEditForm - это глобальная переменная юнита TBXEdit:

var
ToolbarEditForm: TToolbarEditForm;

В юните есть такой код:


procedure DisableEdits;
begin
with ToolbarEditForm do
begin
 eCaption.Enabled := false;
 ......
 //Checkbox1.Enabled := false;
end;
end;


Этот код вызывается после разрушения формы. Как я понял, какое-то событие остаётся необработанным и вызывает этот код.

Таким образом мы видим:

1. Преимущество подхода тотальной (хотя бы временной) замены Free на FreeAndNil.
2. Неверно спроектированный код.
3. Недостатки использования сторонних компонент (хотя я их использую везде, где только могу).
4. Недостатки глобальных переменных.


 
Игорь Шевченко ©   (2009-06-04 12:28) [128]

Дмитрий Белькевич   (04.06.09 12:00) [127]


> 1. Преимущество подхода тотальной (хотя бы временной) замены
> Free на FreeAndNil.


Как средство поиска ошибок - любые средства хороши. В том числе и MemProof, BoundsChecker, FastMM с включенной опцией контроля утечек.


> 2. Неверно спроектированный код.


Дальше можно не рассказывать.


> 4. Недостатки глобальных переменных.


Дай дураку член стеклянный, он и руки порежет и член разобьет


 
Дмитрий Белькевич   (2009-06-04 13:49) [129]


> Как средство поиска ошибок - любые средства хороши. В том
> числе и MemProof, BoundsChecker, FastMM с включенной опцией
> контроля утечек.


Больше инструментов - не меньше. FastMM сам постоянно использую. Иногда и FullDebugMode включаю в нём. Иногда такое вылазит %)


 
Нат ©   (2009-06-04 19:27) [130]

Для глобальных и других долгоживущих переменных обНИЛивание полезно взять за правило
Оbj.Free; Obj:=nil;
Иначе проблематично применить
if not Assigned(Obj) then
          obj:=TObj.Create()



Страницы: 1 2 3 4 вся ветка

Форум: "Прочее";
Текущий архив: 2009.08.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.74 MB
Время: 0.022 c
2-1244113576
Iriss
2009-06-04 15:06
2009.08.02
Clipboard Кодировка


15-1243941074
plastic
2009-06-02 15:11
2009.08.02
Кто ни будь пробовал настраивать D2009 ???


15-1243697653
oldman
2009-05-30 19:34
2009.08.02
Вопрос москвичам (очень надо). А до Алтуфьево метро пустили?


2-1244467602
Wind
2009-06-08 17:26
2009.08.02
Событие в Delphi


2-1244472613
lewka
2009-06-08 18:50
2009.08.02
Работа в Word





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский