tag:blogger.com,1999:blog-1702873441071265539.post1744098679651608172..comments2023-05-29T19:02:20.570+03:00Comments on Блог GunSmoker-а: Почему всегда нужно использовать FreeAndNil вместо FreeGunSmokerhttp://www.blogger.com/profile/15611696588191431330noreply@blogger.comBlogger52125tag:blogger.com,1999:blog-1702873441071265539.post-82036764857590166432018-11-15T20:31:40.693+03:002018-11-15T20:31:40.693+03:00парсер угловые скобки съел. Должно быть FreeAndNil...парсер угловые скобки съел. Должно быть FreeAndNil[T: class] и внизу соответственно FreeAndNil[T]. Вместо квадратных скобок соответствующие угловые.vpbarhttps://www.blogger.com/profile/07792208610421249393noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-62417818703371733282018-11-15T20:28:18.448+03:002018-11-15T20:28:18.448+03:00Как автор того поста скажу, что сейчас я бы сделал...Как автор того поста скажу, что сейчас я бы сделал так<br /><br />unit FreeAndNilHelper;<br />interface<br />type<br /> TFreeAndNilReservedType = TObject;<br /> TObjectHelper = class helper for TObject<br /> public<br /> class procedure FreeAndNil(var Obj: T);<br /> end;<br /> procedure FreeAndNil(var Obj: TFreeAndNilReservedType);<br /><br />implementation<br />class procedure TObjectHelper.FreeAndNil(var Obj: T);<br />var<br /> Tmp: T;<br />begin<br /> Tmp := Obj;<br /> Obj := nil;<br /> Tmp.Free;<br />end;<br />procedure FreeAndNil(var Obj: TFreeAndNilReservedType);<br />begin<br />//raise<br />end;<br />end.<br /><br />И модуль подключить последним где нужно. Это лучше решает задачу проверки вызова FreeAndNil<br />vpbarhttps://www.blogger.com/profile/07792208610421249393noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-87463728205183215562018-03-31T05:24:20.121+03:002018-03-31T05:24:20.121+03:00ну...
>> речь идёт именно о замене Free на ...ну...<br /> >> речь идёт именно о замене Free на FreeAndNil везде<br />Посоветовали бы вы так же "сделать везде" то что предлагается в данной статье?Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-52355485994649452362018-03-30T00:09:58.224+03:002018-03-30T00:09:58.224+03:00А что вы хотите услышать? Если у вас есть такая пр...А что вы хотите услышать? Если у вас есть такая проблема - действуйте.GunSmokerhttps://www.blogger.com/profile/15611696588191431330noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-1592724746947912962018-03-29T21:08:13.575+03:002018-03-29T21:08:13.575+03:00А что скажете про это?: https://habrahabr.ru/post/...А что скажете про это?: https://habrahabr.ru/post/177431/Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-54475391021943124292017-01-25T21:15:47.245+03:002017-01-25T21:15:47.245+03:00http://programmingmindstream.blogspot.ru/2017/01/1...http://programmingmindstream.blogspot.ru/2017/01/1334-free.htmlAlex W. Lulinhttps://www.blogger.com/profile/08400475846894229767noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-84430548825887490092013-12-26T14:13:12.759+04:002013-12-26T14:13:12.759+04:00А ещё грядущий учёт ссылок новых делфей однозначно...А ещё грядущий учёт ссылок новых делфей однозначно приводит к FreeAndNil.<br />зы. Меня как то приучили на студии нилить ссылки. И я быстро понял, что это хорошо.Demonknoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-24263683376652509772013-12-25T18:56:41.924+04:002013-12-25T18:56:41.924+04:00Огромное спасибо за статью. Избавила от большой го...Огромное спасибо за статью. Избавила от большой головной боли с программой.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-70079618461282393062013-10-13T15:12:10.481+04:002013-10-13T15:12:10.481+04:00Free vs FreeAndNil - это тема для холивара))
FreeA...Free vs FreeAndNil - это тема для холивара))<br />FreeAndNil конечно полезен, но лепить его везде - это, имхо, перебор. Просто лишние действия. Напр. для лок. переменных.Anonymoushttps://www.blogger.com/profile/13115572623808336850noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-60043860331988422012013-06-27T05:04:45.608+04:002013-06-27T05:04:45.608+04:00
Я себе даже Code Template на F + Tab забиндил: а... <br />Я себе даже Code Template на F + Tab забиндил: автоматом вставить FreeAndNil(Obj) и выделить Obj, чтобы я сразу впечатал имя переменной. Очень удобно, всего две кнопки, и скобки ставить не надо.<br /><br />Я догадывался, что шаблоны где-то есть, но как-то опасался с ними связываться. А Ваши слова побудили меня с этим разобраться. Действительно удобно. Себе сделал так же и буду советовать другим.<br />Спасибо!Mortareznoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-37614242652766898912013-05-08T01:05:41.390+04:002013-05-08T01:05:41.390+04:00За все 18-ть лет использования Delphi я пришёл ров...За все 18-ть лет использования Delphi я пришёл ровно к тому, что написано в этой статье.<br /><br />ОГРОМНОЕ спасибо автору.Alex W. Lulinhttps://www.blogger.com/profile/08400475846894229767noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-15508648648724455392012-06-25T08:12:58.298+04:002012-06-25T08:12:58.298+04:00Сам в delphi работаю давно. Сначала использовал Fr...Сам в delphi работаю давно. Сначала использовал FreeAndNil, потом перешел на Free, и сейчас много использую именно Free. Но в последнее время (года 3-5) стали лезть не совсем понятные ошибки: программа работает нормально, а стоит ее завершить, сразу лезет Exception, обращение к несуществующему адресу. Сильно подозреваю, что если не обнулить ссылку, сборщик мусора при завершении программы пытается повторно освободить память. Интересно, что ошибки не лезут в мелких программах, но стоит программе разрастись, начинают лезть. Поэтому как минимум надо сначала Free, потом еще и := nil. В связи с вышеизложенным в последнее время стал возвращаться к использованию FreeAndNil, ошибки вылазить перестали.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-89249479783469099262012-03-13T16:31:18.464+04:002012-03-13T16:31:18.464+04:00Я видел. Ник несколько постов писал, а всю серию п...Я видел. Ник несколько постов писал, а всю серию подытожил примерно так: "вам не нужно использовать FreeAndNil, потому что вам нужно использовать интерфейсы". Кто бы спорил :)GunSmokerhttps://www.blogger.com/profile/15611696588191431330noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-72325359284609908712012-03-13T16:03:28.959+04:002012-03-13T16:03:28.959+04:00Александр, вот пример противоположной точки зрения...Александр, вот пример противоположной точки зрения <br /><a href="http://www.nickhodges.com/post/Using-FreeAndNil.aspx" rel="nofollow">Ника Ходжеса</a>.<br /><br />Порадовала фраза "Setting a pointer to nil doesn’t get you anything. The memory isn’t going to be more free or freed faster as a result of calling FreeAndNil. Since it’s always a good practice to use exactly the right tool and nothing more, there’s no need to make the extra call. Consider this – there’s no SetToZero call for integers, and if there were, why would you use it". ))balmohttp://www.gloinsys.comnoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-28296329426100120812011-08-20T19:32:13.344+04:002011-08-20T19:32:13.344+04:00Я просто работаю в тех-поддержке EurekaLog. Этим F...Я просто работаю в тех-поддержке EurekaLog. Этим Free я сыт по горло.<br /><br />Это - инструкция для новичков.GunSmokerhttps://www.blogger.com/profile/15611696588191431330noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-89585845917818745032011-08-20T19:21:13.928+04:002011-08-20T19:21:13.928+04:00Программирую давно, опыта много, проблемы встречаю...Программирую давно, опыта много, проблемы встречаются все реже и реже, теперь уже совсем редко. <br />Тем не менее, с FreeAndNil в последнее время было две проблемы, точнее одна и та же проблема, которая возникла дважды, последовательно в разных местах.<br />Приватное поле класса А - экземпляр класса В, в конструкторе класса А создается, в деструкторе разрушается (freeAndNil). Через некоторое, (продолжительное достаточно) время, ссылка B заменяется на интерфейсную (в рамках внедрения ioc)<br />И все, приплыли. Ошибка из серии "можно потратить много времени, пытаясь понять, что происходит".<br />Если бы там был вызов Free, проблема была бы обнаружена в компайл тайм, а не в ран тайм в виде испорченной памяти неизвестно где.<br />За это же время проблем с обращением к разрушенной и не обниленной переменной не было ни разу. Ни разу, понимаете? Это то, что реально имеется на практике. <br />Так что сабжевое утверждение - насчет "всегда нужно использовать", не соответствует истине. Не говоря уж о том, что обниливание - это совершенно ненужная в большинстве случаев операция, которая тем не менее занимает процессорное время. Пусть это копейки, но зачем? Зачем писать код, который не нужен, и который приводит к проблемам?Юрийnoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-60807333241954578612011-05-16T19:32:28.397+04:002011-05-16T19:32:28.397+04:00Респект автору. Я давно уже стараюсь использовать ...Респект автору. Я давно уже стараюсь использовать исключительно конструкцию FreeAndNil вместо конструкции Free, за исключением тех моментов. когда это форма, создается она динамически и отображается посредством метода Execute, в котором в конце и разрушается, в то время как в вызывающем коде я не ввожу для этого отдельную переменную.<br />Также я НИКОГДА не использую конструкцию with. Хоть она возможно и позволяет писать код быстрее, однако это ее преимущество сходит "на нет" при попытке отдебажить данный код.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-76064729794609886612010-12-21T19:55:38.557+03:002010-12-21T19:55:38.557+03:00FreeAndNil хуже читаемый и расходящийся с объектны...FreeAndNil хуже читаемый и расходящийся с объектным стилем записи кода, чем вызов метода объекта.<br /><br />Дернуть за уже удаленный объект потомки могут, если в их деструкторе inherited Destroy идет не в конце. <br /><br />Если в программе где-то нужно явно ставить <br />Obj := nil <br />имеет смысл саму себе привести доводы, почему это вдруг понадобилось вне рамок синглетона и сделать реструктуризацию.<br /><br />FreeAndNil нужен прежде всего тем разработчикам, которые используют глобальные переменные модуля, чаще всего речь идет о формах.<br /><br />Остальным лучше переходить работать в системы с автоматическим управлением памятью :)Сергей Тарасовhttp://www.arbinada.comnoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-10932216174403798162010-09-29T16:42:24.551+04:002010-09-29T16:42:24.551+04:00Прочёлзаметку.
Заменил все вызовы Free на FreeAndN...Прочёлзаметку.<br />Заменил все вызовы Free на FreeAndNil.<br />Исправил ужасную ошибку, которую не мог отловить больше месяца.<br /><br />Спасибо автору!Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-73426706510809305252010-05-28T19:34:37.183+04:002010-05-28T19:34:37.183+04:00Просьба к автору статьи прокомментировать статью
h...Просьба к автору статьи прокомментировать статью<br />http://www.delphilab.ru/content/view/79/1/<br />по поводу не всегда правильной работы FreeAndNil.<br />(если надо я могу кинуть статью сюда в комментарий - она не большая)Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-24232866968524561712010-03-25T12:16:28.160+03:002010-03-25T12:16:28.160+03:00Переводить уже готовый и написанный проект с Free ...Переводить уже готовый и написанный проект с Free на FreeAndNil "просто так" - наверное, большого смысла в этом нет. Особенно, если вопрос стоит так: работает - и ладно, завтра сдаём.<br /><br />Это имеет смысл делать, если вы собираетесь отлаживать какой-то глюк.<br /><br />С другой стороны, если время позволяет - почему бы и нет. Практика показывает, что во время этого процесса могут найтись баги, которые не были замечены ранее ;) <a href="http://www.tdelphiblog.com/2009/04/10.html" rel="nofollow">Например</a>.GunSmokerhttps://www.blogger.com/profile/15611696588191431330noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-37654136101777407832010-03-25T11:22:06.923+03:002010-03-25T11:22:06.923+03:00в рамках подготовки перевода проекта Free --> F...в рамках подготовки перевода проекта Free --> FreeAndNil решил посмотреть, сколько раз во всех файлах проекта встречается строка ".Free" ........ 820 раз. Задумался, сколько времени понадобится на перевод, плюс еще бы багов не наплодить .....Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-49243248059856755972009-11-26T17:28:05.492+03:002009-11-26T17:28:05.492+03:00Уже в 5й версии делфи реализован код:
procedure Fr...Уже в 5й версии делфи реализован код:<br />procedure FreeAndNil(var Obj);<br />var P: TObject;<br />begin<br /> P := TObject(Obj);<br />TObject(Obj) := nil;<br />P.Free;<br />end;Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-86431327681213599282009-11-19T04:10:39.654+03:002009-11-19T04:10:39.654+03:00После прочтения сей статьи решил взять себя в руки...После прочтения сей статьи решил взять себя в руки и переучиваться писать FreeAndNil, но сегодня напоролся на один интересный момент.<br /><br />Суть такова. Для хранения списка использовал TList. Код работал, перешел к оптимизации, и понял что лучше TList заменить на динамический массив (удобнее и быстрее). Стал заменить, заменил, скомпилировал, запустил, и вуаля. Программа вылетает с Access Violation-ами в очень интересных местах.<br />Как оказалось я в одном единственном месте забыл заменить FreeAndNil(MyList) на SetLength(MyList, 0). Компилятор совершенно здраво скомпилировал и запустил такую конструкцию ниразу не поперхнувшись и не известив ниодним варнингом.<br />Посему вердикт, что FreeAndNil должен быть таким:<br />procedure FreeAndNil(var Obj: TObject);<br />var<br /> Temp: TObject;<br />begin<br /> Temp := Obj;<br /> Obj := nil;<br /> Temp.Free;<br />end;Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-33972801170644940362009-10-23T09:33:42.908+04:002009-10-23T09:33:42.908+04:00Пример можно? :)Пример можно? :)GunSmokerhttps://www.blogger.com/profile/15611696588191431330noreply@blogger.com