|
|
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
rgreat kealon(Ruslan), Код: pascal 1. 2. 3. 4. 5. Ошибки обработать по желанию/необходимости. вот он уже точно нигде не нужен Какой смысл устраивать себе мазохизм? когда появился FreeAndNil, на своём первом крупном проекте, я отловил кучу ошибок с помощью него rgreat alekcvp Только в случае FreeAndNil() указатель будет обнулён, а в вашем варианте - нет. Очистка объекта не завершена а указатель уже обнулен. Мы имеем утечку памяти и все предпосылки к сбою, в случае если если это не до убитый поток или нечто с этим связанное. и толку вам от ссылки на недобитый объект? идеальный вариант в этом случае, в подавляющем большинстве вариантов: приложение должно падать с багрепортом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2020, 08:32 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan) Free это более старый и ненадёжный костыль, чем FreeAndNil вот он уже точно нигде не нужен Появление Free обусловлено, скажем так, особенностью языка, когда деструктор может быть вызван у недоконструированного объекта. А появление FreeAndNil обусловлено особенностями некоторых индивидов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2020, 09:03 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
rgreat Метод вообще на мой взгляд не нужен По поводу "не нужен" я уже высказался выше. Я слышал много таких теорий, практически обо всём. Что исключения не нужны и вредны, например, мне тоже доказывали прямо здесь. rgreat по этому на мой обсуждать какой из них лучше это не.более чем разминка для мозга. Так кто же мешает в рамках разминки для мозга ответить на заданный вопрос? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2020, 10:08 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan) идеальный вариант в этом случае, в подавляющем большинстве вариантов: приложение должно падать с багрепортом. Падающее приложение в подавляющем большинстве вариантов максимально далеко от идеала. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2020, 11:31 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
rgreat А бывают Kazantsev Alexey появление FreeAndNil обусловлено особенностями некоторых индивидов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2020, 11:37 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
vavan, Вы просто в одном месте вешаете Try-Except-on&do и оно уже за всем следит. Можно даже глобально установится свой обработчик. Но суровые - тёртые колочи, на каждый пшик вешают Try-Except-on&do ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2020, 17:26 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Тертым калачам надо обработчик ошибки писать в зависимости от места. А не один на всех. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2020, 17:37 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
softwarer Так кто же мешает в рамках разминки для мозга ответить на заданный вопрос? Да как-то даже душа не лежит в этом рытся. Хорошего решения-то нет. Обработчик ошибок в нее нормально не встроить, а без этого она в общем виде мне нафиг не нужна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2020, 17:40 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
rgreat, Ошибка может случится где угодно, в любом месте - в зависимости от погонных условий. 1000 обработчиков велишь пихать? Обработчик нужен чисто - для выявления проблемы, под отладкой можно найти место ошибки (Хотя я сомневаюсь что вы удосужитесь освободить указатель, и нарвётесь на кучу других проблем, и вам это никак не поможет) На крайняк всегда должен висеть Application.OnException ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2020, 17:41 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
ВсеРазумный, Спасибо за советы, но я как-нибудь сам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2020, 17:50 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
rgreat Да как-то даже душа не лежит в этом рытся. Хорошего решения-то нет. То есть, Вы дали плохое решение? rgreat Обработчик ошибок в нее нормально не встроить, а без этого она в общем виде мне нафиг не нужна. Это, кстати, довольно характерная черта велосипедов из 22127447 . Для решения простой задачи люди пишут уйму сложного кода, будучи свято уверены в том, что это их эксклюзивное ноу-хау для сложных задач. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2020, 17:54 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
softwarer То есть, Вы дали плохое решение? softwarer Для решения простой задачи люди пишут уйму сложного кода, будучи свято уверены в том, что это их эксклюзивное ноу-хау для сложных задач. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2020, 17:58 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Сабжевая функция при всей своей относительной полезности и кажущейся безобидности имеет один неприятный сайд-эффект. Если деструктор дергает обработчик события, из которого идет обращение к переменной класса (довольно распространенная ситуация на самом деле), получаем AV, которого не было при простом вызове Free и последующем занулении. Так что бездумно использовать ее не стоит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2020, 03:26 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
misha mike, ДезИнформация! Ибо в любом случае ты обнуляешь глобальную переменную, к которой обращаешься из обработчика. Передавай в обработчик объект this(self) класса, а не обращайся глобально. Опять проблема функции - не доказана. Доказана кривизна рук. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2020, 04:40 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
В принципе то мне понятно почему изначально в ОПП обработчиков вкладывался Sender: TObject что бы всегда иметь ссылку на свой класс. Но многие стесняются использовать драгоценный Sender as TClass, и передавать куда угодно, и там же использовать. Не имея ссылок на глобальные переменные класса Пиля сук на котором стоишь, ты в любом случае роешь себе могилу. И неважно что ты используешь, включая FreeAndNil Тут как говорится - или рыбку съесть(Передать указатель), или на кол сесть (Всё равно обнулить переменную) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2020, 04:44 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
misha mike Сабжевая функция при всей своей относительной полезности и кажущейся безобидности имеет один неприятный сайд-эффект. Если деструктор дергает обработчик события, из которого идет обращение к переменной класса (довольно распространенная ситуация на самом деле), получаем AV, которого не было при простом вызове Free и последующем занулении. Так что бездумно использовать ее не стоит. какой смысл от наполовину разрушенного объекта? объект пошёл на удаление - нефиг к нему лезть по глобальным переменным, только по эксклюзивному доступу (передавая указатель на себя) подписчикам, собственно как в 22128594 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2020, 08:30 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
misha mike (довольно распространенная ситуация на самом деле) Тем, у кого она распространена, стоит задуматься о степени служебного соответствия. misha mike получаем AV, которого не было при И хорошо. Это отличная удобная индикация проблемы, которая возникает в 100% случаев, правится за пару минут и при наличии хотя бы минимального тестирования не имеет практических шансов дойти до продакшна. Так гораздо лучше, чем позволить программе рандомное удовольствие работы с внутренностями полуосвобождённых объектов и выгребать ситуации типа "компилирую в debug - всё хорошо, а собираю release - и на проде вываливается проблема". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2020, 09:42 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Всё так. Не существует ни одной причины хранить зомби-ссылки. Как бы тут ни старались убедить в обратном. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2020, 12:23 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
ВсеРазумный, Во-первых, не всегда Sender равен уничтожаемому объекту. Даже в стандартных компонентах это часто инкапсулированный объект, который не факт, что имеет ссылку на хозяина. А во-вторых, в программах сложнее калькулятора цепочка вызовов из обработчика может может быть очень длинной, и никакой Sender в ее дальний конец уже не передается. Каждый инструмент имеет свою область применения, FreeAndNil не является универсальным способом уничтожения объекта, точка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2020, 12:32 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
softwarer Так гораздо лучше, чем позволить программе рандомное удовольствие работы с внутренностями полуосвобождённых объектов и выгребать ситуации типа "компилирую в debug - всё хорошо, а собираю release - и на проде вываливается проблема". О каком полуосвобождении идет речь? Вызов обработчика из деструктора -- совершенно нормальная практика. А что будет в обработчике, не всегда известно тому, кто этот обработчик пишет. Там может быть вызов пользовательского скрипта, который не определен на этапе разработки программы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2020, 12:39 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
makhaon Всё так. Не существует ни одной причины хранить зомби-ссылки. Как бы тут ни старались убедить в обратном. А кто говорит про зомби? Пока не отработал деструктор, ссылка остается вполне актуальной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2020, 12:41 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
misha mike makhaon Всё так. Не существует ни одной причины хранить зомби-ссылки. Как бы тут ни старались убедить в обратном. А кто говорит про зомби? Пока не отработал деструктор, ссылка остается вполне актуальной. Т.е. пока работает деструктор, то объект по этой ссылке можно дёргать из другого потока, например? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2020, 12:58 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
misha mike О каком полуосвобождении идет речь? О том, которое Вы только что с блеском подтвердили своим тезисом про ссылку на хозяина. Простой пример на пальцах. На форме размещён фрейм, у фрейма прописан обработчик OnDestroy. Суть Вашей претензии: если сделать форме FreeAndNil, то в момент срабатывания обработчика глобальная переменная формы уже будет равна nil и попытка доступа из обработчика к другим компонентам формы закончится AV. Поэтому FreeAndNil мешает адекватному программированию и это плохо, ай-яй-яй. Суть моего тезиса: к моменту срабатывания обработчика форма уже полуразрушена, попытка доступа к компонентам через глобальную переменную способна привести к разнообразным непредсказуемым эффектам работы с мусором, оставшимся в освобождённой памяти. FreeAndNil спасает от подобных проблем и хорошо, а то, что Вы называете распространённой ситуацией - категорически неадекватно. misha mike Вызов обработчика из деструктора -- совершенно нормальная практика. А что будет в обработчике, не всегда известно тому, кто этот обработчик пишет. Там может быть вызов пользовательского скрипта, который не определен на этапе разработки программы. Угу. Таким образом и появляются программы, которые иногда работают. Например, на одной из работ я столкнулся с тем, что подобные авторы боялись перекомпилировать клиента - потому что компиляция из одних и тех же исходников на одном и том же компьютере с вероятностью порядка 2/3 давала очевидно неработоспособный exe (ну то есть тот, в котором находили грубые ошибки в первые пять-десять минут регресса), а с вероятностью порядка 1/5 - на первый взгляд работоспособный exe (тот, в котором не находили ошибок через час-два регресса). И они несколько лет занимались тем, что старались решить все потребности "скриптами", когда этого не удавалось - отбрыкаться от того, чтобы их делать, а когда не удавалось - вносили изменение и после этого гоняли цикл собрать-тестировать-собрать-тестировать-собрать-тестировать, пока очередное ручное тестирование не говорило, что вроде бы релиз получился жизнеспособным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2020, 13:04 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
alekcvp, А при чем тут другой поток? Потокобезопасные классы -- это отдельная большая песня. Речь о таком, вполне однопоточном кейсе: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. У нас из деструктора вызывается внешний обработчик OnClose, который вполне может обратиться к переменной, указывающей на экземпляр TConnection, но которая была обнулена вызовом FreeandNil еще до вызова деструктора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2020, 13:07 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
softwarer, ваш главный тезис "если вызван деструктор, то экземпляр тут же официально считаестя мертвым" корректен лишь отчасти. В случае класса, где из деструктора вызывается обработчик события, логично ожидать, что на момент вызова обработчика класс все еще находится во вменяемом состоянии и к нему можно так или иначе обратиться. Что касается логики работы FreeAndNil, то она в стремлении не допустить даже кратковременного существования ссылки на мертвый объект, улетает в другую крайность: допускает существование живого и еще работающего объекта при мертвой ссылке. И это тоже неконсистентное состояние программы, хоть и несущее меньше потенциальных проблем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2020, 13:21 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39954721&tid=2038337]: |
0ms |
get settings: |
10ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
29ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
84ms |
get tp. blocked users: |
1ms |
| others: | 253ms |
| total: | 415ms |

| 0 / 0 |
