|
|
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan) объект пошёл на удаление - нефиг к нему лезть по глобальным переменным, только по эксклюзивному доступу (передавая указатель на себя) подписчикам Это все правильно, но не всегда есть возможность заставить всех так делать. При этом имеем ситуацию, когда Free + nil работает идеально, ничего не течет, не крашится, и "математически" стабильно, а FreeAndNil -- мгновенно AV, которое без переписывания половины проекта не побороть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2020, 13:35 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
misha mike В случае класса, где из деструктора вызывается обработчик события, логично ожидать Прежде всего, "логично ожидать" - это не метод надёжного программирования. Метод надёжного программирования - проверять, убеждаться и стараться строить взаимодействие так, чтобы не сломалось в будущем, когда те или иные аспекты реализации могут и переделать. Во вторую очередь, к тому объекту, у которого только что вызван деструктор и который ещё находится во вменяемом состоянии, действительно можно обращаться - и на это, как вполне справедливо заметил Няшик, вполне хватит Sender-а. В отношении его окружения, то есть Owner-а, других компонент в том же Owner-е итп. такое утверждение уже неверно, обращаться нельзя. Поэтому вопрос обращения через глобальные переменные неактуален. Вообще, при написании обработчиков типа OnDestroy надо тщательно продумывать, что делаешь, каким способом и нельзя ли это вынести куда-нибудь пораньше. И наконец, глобальное преимущество FreeAndNil в том, что она оставляет разрушаемый объект в относительно адекватном состоянии в ходе разрушения. То есть, когда случается какая-либо непредусмотренная разработчиками петля, приложение в лучшем случае проверяет на if Assigned и корректно работает дальше, в худшем не проверяет и напарывается на простой и очевидный AV, но не начинает веселухи работы через уже освобождённую память. misha mike Что касается логики работы FreeAndNil, то она в стремлении не допустить даже кратковременного существования ссылки на мертвый объект, улетает в другую крайность: Верно. И в данном случае это хорошая и правильная крайность. Она заставляет явно продумать места, где возникают сложности, а не полагаться на то, что "в этот раз вроде сработало". misha mike допускает существование живого и еще работающего объекта при мертвой ссылке. И это тоже неконсистентное состояние программы, хоть и несущее меньше потенциальных проблем. Оно действительно несёт кардинально меньше потенциальных проблем, это главное (к ранее упоминавшемуся вопросу про правильный порядок действий). Но кроме этого, Вы неправы, называя такое состояние неконсистентным. В том состоянии, о котором идёт речь, затёрты внешние ссылки (и это правильно), но остаются оперативные, недоступные извне - грубо говоря, Self в регистрах и всё, что от него растёт. Это как раз то, что нужно для завершения уничтожения объекта, не более и не менее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2020, 13:58 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
misha mike В случае класса, где из деструктора вызывается обработчик события, логично ожидать, что ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2020, 14:07 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
misha mike Что касается логики работы FreeAndNil, то она в стремлении не допустить даже кратковременного существования ссылки на мертвый объект, улетает в другую крайность: допускает существование живого и еще работающего объекта при мертвой ссылке. И это тоже неконсистентное состояние программы, хоть и несущее меньше потенциальных проблем. Каком образом после FreeAndNil может остаться живой объект?.. А про мёртвую ссылку - при вызове любых событий из деструктора, туда должен передоваться Self как Sender - на это FreeAndNil не влияет никак и ссылка будет жива. misha mike У нас из деструктора вызывается внешний обработчик OnClose, который вполне может обратиться к переменной, указывающей на экземпляр TConnection, но которая была обнулена вызовом FreeandNil еще до вызова деструктора. При чём тут вообще FreeAndNil, если вы его вызываете не вовремя? А если бы вы до вызова деструктора просто .Free вызвали - это было бы корректно что-ли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2020, 14:12 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
misha mike, Вызов из обработчика, по всем канонам ООП должен обращаться только к своему this(self) объекту. И никогда не обращаться на самого же себя, из глобальной переменной которая будет обнулена. В данном случае Sender as TClass всегда указывает на текущий класс (Мы не говорим про случае доп классов, на класс) Если соблюдать каноны, вы бы никогда себе не напридумывали проблем. 1) Ибо вы не можете создать несколько классов - разного типа, 1 класс всегда будет заменять другой, а вы получать пинка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2020, 14:51 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
misha mike а FreeAndNil -- мгновенно AV Пожалуйста, приведите пример кода с AV мы все хотим посмотреть, как вы будете создавать 2 класса из 1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2020, 14:52 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Имеем 1) Класс 1 который ссылается на переменную глобальную класса 1 2) Класс 2 который создаются отдельно, и ссылается на переменную класса 1 Вопрос, что будет если Класс 1 не будет инициализирован хотя бы nil ? И как итог - если Класс 2 будет освобождён, то он обратится к переменной класса 1. И в конечном - увольнение с работы за дилетантство. Не устраиваете на работу к себе misha mike, ибо любитель статичных костылей и незнания стандартных ООП применений (Класс должен быть унивирсальным) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2020, 15:39 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
ВсеРазумный, как хорошо, что ваше мнение никого не волнует. Еще раз для всех собравшихся. Речь не идет об обращении к глобальной переменной класса прямо из обработчика. Речь идет о проекте на миллион строк, где черт ногу сломит, где в том числе работает и написанный пользователем код, где стек вызовов из обработчика имеет сотню уровней. И в этом коде не происходит обращения к мертвым объектам, но возможны обращения к глобальным переменным, потому что никто не тащил Sender через весь стек вызовов. Проект работает идеально, но простая замена Free + nil на FreeAndNil делает его неработоспособным и реального пути исправить это нет. Не протащить Sender каждого обработчика во все уголки, да еще так, чтобы пользовательский код в нужный момент обращался именно к нему, а не к переменной из global scope. И именно об этом я написал в первом сообщении. Констатировал факт, что FreeAndNil <> Free + nil, и это иногда вылазит из неожиданных мест. В мире розовых пони FreeAndNil делает зашибись и избавляет от массы проблем, но реальность суровее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2020, 16:38 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
misha mike kealon(Ruslan) объект пошёл на удаление - нефиг к нему лезть по глобальным переменным, только по эксклюзивному доступу (передавая указатель на себя) подписчикам Это все правильно, но не всегда есть возможность заставить всех так делать. При этом имеем ситуацию, когда Free + nil работает идеально, ничего не течет, не крашится, и "математически" стабильно, а FreeAndNil -- мгновенно AV, которое без переписывания половины проекта не побороть. для этого однозначно программист нужен, пробовали нанять? поиск ошибок с порчей памяти куда дороже обходится чем AV ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2020, 16:48 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
А бездумное напихивание FreeAndNil - тоже заставляет задуматься о том, что программист не вполне уверен в своём коде и закладывается на AV как показатель бага, который не спорю, гораздо легче отыскать... И которого, возможно не могло возникнуть при правильной архитектуре)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2020, 18:23 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
misha mike, Так зачем вы используете классы ? Вам не кажется что классы в вашем проекте - лишнее. Используется object объекты, или record Вы не можете создать больше 1 класса, не нарушив логику работы двух экземпляров. Ваш код - говнокод. В помойку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2020, 18:52 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
white_nigger А бездумное напихивание FreeAndNil - тоже заставляет задуматься о том, что программист не вполне уверен в своём коде и закладывается на AV как показатель бага, который не спорю, гораздо легче отыскать... Это не Не бездумное напихование, это гарант что программист не забудет обнулить ссылку на объект, который возможно по случайности где - то случайно начнёт использовать когда его не существует. И будет не понимать, почему у него беда Написать free может каждый, а вот nil сделать - не каждый (Просто забыть) white_nigger И которого, возможно не могло возникнуть при правильной архитектуре)) Ну если программист самоучка начал писать свои велосипеды, и в будущем не может от них избавится... Это конечно беда. Ибо в них и вправду чёрт ногу сломишь, из за никого качества кода, и непродуманности ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2020, 19:03 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), там не программист нужен, а волшебник. Точнее, команда волшебников. А проект работает и продается за очень большие деньги. Просто однажды попробовали сделать по канонам и заменить кое-где Free на FreeAndNil, получили что получили, и откатили назад. Никто все равно не вложил бы кучу денег в переписывание того, что отлично работает. Мне тот проект давно пофиг на самом деле, я лишь написал, что даже в сбалансированном (пусть и не по канонам писаном) приложении использование FreeAndNil может добавить головняка. Что хотел, сказал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2020, 19:04 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
misha mike, Мне искренне жаль людей, которые покупают низко качественный продукт за большие деньги. (Возможно и переписать то там возможно за ночь с кружкой кофе не смотря в код, разумеется. Только ТЗ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2020, 19:10 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
white_nigger А бездумное напихивание FreeAndNil - тоже заставляет задуматься о том, что программист не вполне уверен в своём коде и закладывается на AV как показатель бага, который не спорю, гораздо легче отыскать... И которого, возможно не могло возникнуть при правильной архитектуре)) самому то не смешно? это неплохая защита и от последующих возможно косых изменений, что бы было видно когда забажили ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2020, 21:36 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan) самому то не смешно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2020, 21:57 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Товарищи, в таком русле ваш спор совершенно пустой. Бездумное использование FreeAndNil - плохо, конечно. Бездумное использование молотка тоже плохо, например. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2020, 22:01 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Гаджимурадов Рустам Товарищи, в таком русле ваш спор совершенно пустой. Бездумное использование FreeAndNil - плохо, конечно. Бездумное использование молотка тоже плохо, например. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2020, 22:04 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
А я ещё раз повторю что, функция FreeAndNil нужна, когда нужно уничтожить объект, и ссылку на него. Что бы не обращаться к удалённому объекту, и не использовать не инициализированный объект. Если при использование FreeAndNil вы видите ошибку AV, то вы плохой и ужасный программист. В том смысле, что вы заставляете работать класс с 1 экземпляром класса, который нельзя создать в другую переменную - изолировано. Функция была придумана из выше сказанного, что бы не забывать дописать nil - переменной объекта, что бы в будущем не использовать объект, который уже был послан на уничтожение. Деструктор, должен передавать в свои коллбэки ссылку на this(self) класса. А не ссылатся из коллбэка в глобальную область памяти. Деструкту, и его методам - не нужно глобальная область переменных, которые ссылаются на свой же экземпляр. Мы говорим о использование FreeAndNil в классовых объектах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2020, 23:16 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Вот вам презик 100% защиты Код: 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. В нём совершенно нет ничего плохого в FreeAndNil. Вы туда не сможете передать ничего, что не имеет класса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2020, 23:28 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Няшик, спи уже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2020, 00:00 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
white_nigger А бездумное напихивание FreeAndNil - тоже заставляет задуматься о том, что программист не вполне уверен в своём коде и закладывается на AV как показатель бага, который не спорю, гораздо легче отыскать... И которого, возможно не могло возникнуть при правильной архитектуре)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2020, 00:47 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Вам на ночь глядя: https://www.google.com/search?client=firefox-b-d&q=nick hodges freeandnil ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2020, 00:49 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
makhaon Ну не знаю, не знаю.. Что плохого в том, что компилятор за тебя решает как сравнивать типы разного характера 35 = "35str" Тем более, я более чем уверен что написанное на c++ это делает как Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Данный код, укороченный рабочий прототип одного закрытого проекта. В данном случае, goto работает никак switch стандартный. А именно jmp OFFSET Код: sql 1. 2. 3. 4. 5. 6. 7. Это чистая адресация, по сравнению с тем, что мы можем видеть при switch Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. На самом деле сравниваемых типов около 16, это ресурсы \ структуры и прочее. Я оставил только основное, и switch генерирует слишком много cmp что в два раза медленнее работает если сравниваемый объект хранится в конце списка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2020, 01:45 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39955055&tid=2038337]: |
0ms |
get settings: |
7ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
23ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 210ms |
| total: | 310ms |

| 0 / 0 |
