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

Вниз

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

 
Anatoly Podgoretsky ©   (2009-05-31 18:03) [40]

Лозунн - долой строгую типизацию.


 
Anatoly Podgoretsky ©   (2009-05-31 18:07) [41]


> Palladin ©   (31.05.09 18:02) [39]

Надеяться на дядю не стоит, а стоит писать код без повторного использования переменных.


 
Юрий Зотов ©   (2009-05-31 19:31) [42]

> пишете код вообще без ошибок?
Без технических ошибок кодинга - практически.

> И с доступом к разрушенным объектам уже наццать лет не сталкивались?
Практически да.

PS
Как и с утечками памяти, неосвобожденными ресурсами и т.п.

PPS
И ничего удивительного в этом нет. Никто же не удивляется тому, что профессиональные музыканты практически не ошибаются в нотах? Все понимают, что ноты для них - это всего лишь азбука. Азы профессии.

Почему же у программистов должно быть иначе? Кодинг без технических ошибок, отслеживание указателей, памяти и т.п. - это тоже азы профессии. Самое обычное дело.


 
Petr V. Abramov ©   (2009-05-31 23:00) [43]


> Юрий Зотов ©   (31.05.09 19:31) [42]


> Никто же не удивляется тому, что профессиональные музыканты
> практически не ошибаются в нотах?

"а если сунуть четвертак, то он сыграет и не так" :)


 
Дмитрий Белькевич   (2009-06-01 00:37) [44]

>Практически да.

И в команде работаете? И все такой код пишут? И чужой код всегда нормально удаётся исправлять? Можно только позавидовать...

>И ничего удивительного в этом нет.

> Типа напишем мы FreeAndNil, ну и ладно, что не проследил за использованием, все равно выскочит AV гдето по адресу около нулевого и там поймем... вместо того, что бы сразу приучать с малых лет себя не делать плохо, учат надеятся дядю FreeAndNil.

Поэтому я и предлагаю. Продвинуться дальше. И в тестовых целях менять Free на FreeAndNil. Уже прямо в памяти, без исправления сырцов.

p.s. У меня, кстати, на обниленных указателях на объекты кое-где логика строится, тоже не комильфо?


 
Германн ©   (2009-06-01 01:37) [45]


> > пишете код вообще без ошибок?
> Без технических ошибок кодинга - практически.
>

+1
Это на автомате.
Очепятки возможны. Но все компиляторы позволяют их излечивать/исправлять "на лету".


 
Нат ©   (2009-06-01 01:50) [46]

Лишний вызов, это значит, что нужные действия мы переносим совсем в другое место, в другую процедуру. И ее вызов тоже требует ресурсов и дополнительного исполняемого кода.
Object.Free; Object:=nil; //вызов одного метода, одно присвоение
//Либо
procedure FreeAndNil(var Obj); //вызов процедуры, передача аргумента
var
 Temp: TObject; //выделение переменной
begin
 Temp := TObject(Obj);  //приведение к типу, присвоение
 Pointer(Obj) := nil; //получение указателя, присвоение
 Temp.Free; //вызов метода
end; //возврат из процедуры


 
oxffff ©   (2009-06-01 10:09) [47]


> Германн ©   (01.06.09 01:37) [45]
>
> > > пишете код вообще без ошибок?
> > Без технических ошибок кодинга - практически.
> >
>
> +1
> Это на автомате.


Вы сказочник. :)


 
@!!ex ©   (2009-06-01 11:11) [48]

> [47] oxffff ©   (01.06.09 10:09)
> Вы сказочник. :)

Два-три плавающих бага из-за ошибки с указателями, и больше всю жизнь ни одной ошибки...


 
oxffff ©   (2009-06-01 11:37) [49]


> @!!ex ©   (01.06.09 11:11) [48]


Исчо один сказочник. :)


 
Дмитрий Белькевич   (2009-06-01 12:16) [50]

Вообще, у меня тоже как бы немного таких ошибок. Но, знаете, они жизнь ну очень сильно портят...

Случайно обратил внимание, кстати, на Indy. Во многих местах именно FreeAndNil.


 
oxffff ©   (2009-06-01 12:47) [51]


> Дмитрий Белькевич   (01.06.09 12:16) [50]


Не ошибается тот, кто ничего нового не делает.


 
Игорь Шевченко ©   (2009-06-01 13:15) [52]

oxffff ©   (01.06.09 12:47) [51]

Боюсь, ты попал в сказочную страну - у меня тоже нет упомянутых ошибок ("технических ошибок кодинга").
Неважно, в новых ли, в старых ли проектах.

Кроме всего прочего я не так часто код набираю - я его стараюсь генерировать


 
jack128_   (2009-06-01 14:11) [53]


> И ничего удивительного в этом нет. Никто же не удивляется
> тому, что профессиональные музыканты практически не ошибаются
> в нотах?

между "практически не ошибаются" и "не ошибаются" есть принципиальная разница.

Лично я стараюсь никогда не закладыватся на свой или не свой проф. навык.  И ассерты ставлю, и ReportOnMemoryLeak для более раннего обнаружения своих собственных ошибок. В том числе и FreeAndNil(FMyObjField) в деструкторе классов, как в примере выше.


 
Дмитрий Белькевич   (2009-06-01 14:18) [54]


> Кроме всего прочего я не так часто код набираю - я его стараюсь
> генерировать


И что-то сложнее "Hello World" получается? ;)


 
Дмитрий Белькевич   (2009-06-01 14:23) [55]

Хорошо, конечно, когда можно модели кода полностью собрать, и по ним готовый код сделать...

У нас, обычно, на момент старта написания программы, в лучшем случае, известно 20-30% её финальной функциональности. Поэтому почти всё - методом проб и ошибок.
И от нас мало зависит. Как бы проще сказать... Среда выполнения сильно нестационарная. Треть кода исследовательского - заранее неизвестно что получится, и получится ли вообще. Готовых рассчетных алгоритмов нет почти ни для чего, либо они недоступны, или запредельно дороги.

Ну а если бы задача заранее на 100% была описана, тогда, конечно - рисуй себе модель и генери код... Эхххх.... Жизнь малиной показалась бы ;)


 
Дмитрий Белькевич   (2009-06-01 14:27) [56]

Не говоря о том, с чем приходится сторонним работать... Куча оборудования, горы ошибок и нестандартного поведения. Почти от всех нет никакой вразумительной документации... В самих конторах - производителях оборудования (конкретно с Сименсом так было, был особенно тяжелый случай) бывает софт писали уже несколько лет назад и уже давно всех поувольняли. А те, кто работают, разбираться не могут и не будут... И так везде... Эххх... Генераторы кода - это сказка...


 
Игорь Шевченко ©   (2009-06-01 14:50) [57]

Дмитрий Белькевич   (01.06.09 14:18) [54]


> И что-то сложнее "Hello World" получается? ;)


Безусловно: HelloWorld1, HelloWordl2, HellowWorld3...


 
Дмитрий Белькевич   (2009-06-01 15:27) [58]


> Безусловно: HelloWorld1, HelloWordl2, HellowWorld3...


Шучу, конечно, не принимайте близко к сердцу ;)


 
Игорь Шевченко ©   (2009-06-01 15:33) [59]

Дмитрий Белькевич   (01.06.09 15:27) [58]

Да ни боже мой.
Просто у меня идиосинкразия к методу copy/paste, а код более или менее одинаковый приходится писать. Потому пусть лучше за меня его компьютер пишет - он железный :)


 
Дмитрий Белькевич   (2009-06-01 15:39) [60]


> Просто у меня идиосинкразия к методу copy/paste, а код более
> или менее одинаковый приходится писать.


Ну это да, копи/паст - это абсолютное зло...


 
oxffff ©   (2009-06-01 15:49) [61]


> Игорь Шевченко ©   (01.06.09 13:15) [52]
> oxffff ©   (01.06.09 12:47) [51]
>
> Боюсь, ты попал в сказочную страну - у меня тоже нет упомянутых
> ошибок ("технических ошибок кодинга").


Если вы каждый день имеете дело с одним и тем же, то было бы странно допускать ошибки. Для остальных случаях вы просто лукавите.
Вы подтверждаете мои слова в своем посте [59].


 
Игорь Шевченко ©   (2009-06-01 16:36) [62]

oxffff ©   (01.06.09 15:49) [61]

Может тебя забанить ?


 
oxffff ©   (2009-06-01 16:49) [63]


> Игорь Шевченко ©   (01.06.09 16:36) [62]


А за что?


 
oxffff ©   (2009-06-01 17:02) [64]


> Игорь Шевченко ©   (01.06.09 16:36) [62]


То есть вы будете продолжать настаивать, что для сложной системы,
где одни объекты связаны с другими, причем эти отношения могут быть как отношения владения, так и использования. Причем связи могут циклическими. Причем в эту схему могут вмешиваться внешние компоненты(не вы их автор) и устанавливать эти связи произвольно.
Вы напишите первую версию без багов?
Возмите VCL в ней до сих пор есть ошибки, возьмите языки программирования Delphi в нем есть ошибки.
Неужели вы считате себя более профессиональными чем авторы delphi и VCL?

Вы можете меня безусловно забанить. Однако от этого пострадает только форум. Поскольку алтернативных точек зрения(отличных от вашей и моей в том числе будет меньше). Выбор за вами.


 
Юрий Зотов ©   (2009-06-01 17:03) [65]

> oxffff ©   (01.06.09 15:49) [61]

> Если вы каждый день имеете дело с одним и тем же

А что, у Вас каждый день новая Delphi с новым языком?

Если нет, то Вы не понимаете, о чем здесь идет речь.

Для остальных случаях вы просто лукавите.
(с) oxffff


 
oxffff ©   (2009-06-01 17:15) [66]


> Юрий Зотов ©   (01.06.09 17:03) [65]


Приветствую Вас, Юрий.
Я честно не понял в чем ко мне .....


 
Игорь Шевченко ©   (2009-06-01 17:26) [67]

oxffff ©   (01.06.09 17:02) [64]

Прочитай пост [42] внимательно, чтобы понять, о каких ошибках тебе говорят. Не надо вкладывать свой смысл в чужие слова и на основании этого вложенного своего смысла устраивать флейм.


 
Юрий Зотов ©   (2009-06-01 17:27) [68]

> oxffff ©   (01.06.09 17:15) [66]

Речь идет о технических ошибках кодинга. Например, забыть освободить память. Не отследить обращение к уже уничтоженному объекту. Не проинициализировать переменную. И т.п.

И какие бы Вы суперновые задачи ни решали, хоть ежедневно по десятку, Вы все равно пишете тот же самый код, на том же самом языке, с использованием той же самой библиотеки. Все те же GetMem/FreeMem, try/finally/except, Create/Free и т.п.

Это первое. Есть и второе - не стоит полагать, что Вы здесь единственный, кто делает что-то новое. Пусть даже это новое только для него, суть от этого не меняется.

И третье. Какую бы сверхновую (пусть даже только для себя) задачу ни решал профессиональный программист, на технические ошибки кодинга он не имеет права. Иначе он не профессионал.

Это все равно, что певец, который не попадает в ноты.


 
AndreyV ©   (2009-06-01 17:34) [69]

> [57] Игорь Шевченко ©   (01.06.09 14:50)
> Дмитрий Белькевич   (01.06.09 14:18) [54]
> > И что-то сложнее "Hello World" получается? ;)
>
> Безусловно: HelloWorld1, HelloWordl2, HellowWorld3...

Гы. Только стишок запостил.;)
http://delphimaster.net/view/15-1237489213/
сообщение [185]


 
Дмитрий Белькевич   (2009-06-01 17:44) [70]

>Это все равно, что певец, который не попадает в ноты.

Увы, бывает... То, что вы слышите на CD (или на чем слушаете...) - это результат многонедельно отполированных записей. Концерты же, скажем так, неидеальны.


 
clickmaker ©   (2009-06-01 17:47) [71]

> Это все равно, что певец, который не попадает в ноты

это еще можно чем-то компенсировать...
а вот, например, водитель автобуса, который постоянно забывает закрыть дверь, отъзжая от остановки - тут сравнение более уместное -)


 
Дмитрий Белькевич   (2009-06-01 17:47) [72]


> Концерты же, скажем так, неидеальны.


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

Программисткие же косяки обычно видны сразу.


 
Дмитрий Белькевич   (2009-06-01 17:48) [73]


> а вот, например, водитель автобуса, который постоянно забывает
> закрыть дверь, отъзжая от остановки - тут сравнение более
> уместное -)


Ему проще... Ему горит лямпочка - закрой... Вот автор тоже предлагает такую лямпочку добавить...


 
Дмитрий Белькевич   (2009-06-01 17:51) [74]


> это еще можно чем-то компенсировать...


Слышали, кстати, как сейчас голоса вокодерами в попсе фильтруют (вероятно, хитро накладывая несущий тон), от чего меня просто коробит? А знакомого просто выворачивает...


 
clickmaker ©   (2009-06-01 17:56) [75]

> Слышали, кстати, как сейчас голоса вокодерами в попсе фильтруют

да я даже не про это.
Например, если певец поет что называется "с душой" плюс интересно обыгрывает свое выступление, ему можно простить полтона вправо, полтона влево.
А вот бывает поет ноль в ноль по нотам, но не цепляет...


 
AndreyV ©   (2009-06-01 17:59) [76]

> [74] Дмитрий Белькевич   (01.06.09 17:51)
> Слышали, кстати, как сейчас голоса вокодерами в попсе фильтруют
> (вероятно, хитро накладывая несущий тон), от чего меня просто
> коробит? А знакомого просто выворачивает...

Недавно постил сообщение [181] в
http://delphimaster.net/view/15-1237489213/
Девушка без вокодера так делает, если ты об этом. Оффтоп впрочем.


 
Ганя   (2009-06-01 23:31) [77]

Ну тут все верно - насчет технических ошибок кодинга.
Однако приведенная выше ситуация - по коду, приведенному в посте 7, и вероятная ошибка - обращение к разрушенному объекту за счет неверного представления о последовательности вызовов в предке - по моему мнению за рамки технических ошибок выходит.
Профессионал избегает технических ошибок на автоматизме, а в данном случае требуется анализ кода - возможно чужого, и ни о каком автоматизме речи быть не может.
У меня, по крайней мере, ошибки такого плана время от времени бывают (в то время, как технических ошибок также практически не бывает уже очень давно).
А вот уже после того, как выясняется, что лучше поставить разрушение приватного члена после inherited Destroy, можно с чистой совестью заменять FreeAndNil на Free

Так что про каждого овоща, который хорош в в свое время и место - все верно)


 
asails   (2009-06-02 15:49) [78]


> Юрий Зотов ©   (01.06.09 17:27) [68]

> Речь идет о технических ошибках кодинга.


Ага, мне тут как-то надо было всего-то диалоговое окно модально показать и убить... Причем юнит формы уже давно кем-то написан был. Вызываю так:
with TSuperPuperForm.Create(nil) do
try
 ShowModal;
finally
 Free;
end;


Казалось, чего уж проще?... Ан нет! Вылетает ексэпшн. Полез в код, и аж побледнел! Там примерно такое (сокращеный вариант ессно):
type
 TSuperPuperForm = class(TForm)
   procedure FormShow(Sender: TObject);
 end;

var
 SuperPuperForm: TSuperPuperForm;

implementation

{$R *.dfm}

procedure TSuperPuperForm.FormShow(Sender: TObject);
begin
 SuperPuperForm.Color := CL_MAINCOLOR;
end;


Причем я посмотрел, как оно до меня вызывалось и не падало, и узрел вот что:
SuperPuperForm := TSuperPuperForm.Create(nil);
 try
   SuperPuperForm.ShowModal;
 finally
   FreeAndNil(SuperPuperForm);
 end;


А теперь вопрос, где у меня техническая ошибка кодинга? И за что мне это? :(


 
Игорь Шевченко ©   (2009-06-02 16:07) [79]


> with TSuperPuperForm.Create(nil) do
> try
>  ShowModal;
> finally
>  Free;
> end;


Я тебе Access Violation устрою мигом в такой конструкции - поставлю у формы Action := caFree на OnClose и AV тебе гарантирован.

Кстати, у ряда форм, от которых после показа не нужны никакие данные, такой OnClose мной установлен в предке :)


 
Юрий Зотов ©   (2009-06-02 19:04) [80]

> А теперь вопрос, где у меня техническая ошибка кодинга?

Ошибка не лично Ваша, но для проекта это роли не играет. Вот она:
var
 SuperPuperForm: TSuperPuperForm;

Остальное - это уже следствия.

Модуль писал не профи. Модуль писал чайник. И запросто может оказаться, что это не единственная и не самая серьезная его плюха.

Поэтому очень хорошо, что вывалилась ошибка - иначе Вы никогда бы не узнали, что модуль подозрительный и что его надо хотя бы проверить.

===========

PS
Но Ваш пример к сабжу не относится. В Вашем случае что бы там у него ни стояло - хоть Free, хоть FreeAndNil - результат один и тот же.



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

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

Наверх





Память: 0.67 MB
Время: 0.01 c
15-1243963056
дмитрий
2009-06-02 21:17
2009.08.02
архивация данных


15-1243518797
Unknown user
2009-05-28 17:53
2009.08.02
Использование компилятора в своих программах


2-1244093484
AntiUser
2009-06-04 09:31
2009.08.02
Найти класс


2-1244196096
a.a.j.
2009-06-05 14:01
2009.08.02
webbrowser и drag&drop


2-1244170279
Саша
2009-06-05 06:51
2009.08.02
Создание и удаление объектов в Run-time





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский