|
|
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Достало, что в FreeAndNil можно по ошибке передать что угодно и компилятор это никак не проверяет. Решил исправить. Делает тоже самое, но передавать можно только объекты. Наслаждайтесь. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2020, 18:54 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Maxim Rusov Достало, что в FreeAndNil можно по ошибке передать что угодно и компилятор это никак не проверяет. а какие из-за этого проблемы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2020, 19:44 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
X11 Maxim Rusov Достало, что в FreeAndNil можно по ошибке передать что угодно и компилятор это никак не проверяет. а какие из-за этого проблемы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2020, 19:46 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
X11 Maxim Rusov Достало, что в FreeAndNil можно по ошибке передать что угодно и компилятор это никак не проверяет. а какие из-за этого проблемы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2020, 20:58 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Является ли этот метод адским хаком? Какие есть недостатки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2020, 21:33 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Michael Longneck Является ли этот метод адским хаком? Какие есть недостатки? Ну, одну несовместимость я словил. Но и 2 ошибки нашел в except частях, которым уже хрен знает сколько лет. Так что я его в Debug включаю, а в Release отключаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2020, 21:53 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Michael Longneck Является ли этот метод адским хаком? Какие есть недостатки? даже если предложенная замена это хак, то выходит, что один хак заменили другим, чуток более удобным ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2020, 11:51 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Maxim Rusov Код: pascal 1. Можно еще проще: Код: pascal 1. 2. 3. 4. 5. Maxim Rusov Достало, что в FreeAndNil можно по ошибке передать что угодно и компилятор это никак не проверяет. Сложно, наверное, работать в команде с людьми, которые делают такие ошибки... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2020, 11:58 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
wadman Сложно, наверное, работать в команде с людьми, которые делают такие ошибки... Сложно работать в команде с людьми, которые даже не проверяют, что они написали ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2020, 12:35 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Ну не просто так же было в оригинале написано (var Obj) скорее всего, подразумевалось что, можно вызвать не только для объекта с наследником TObject ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2020, 12:50 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
wadman Можно еще проще: Код: pascal 1. 2. 3. 4. 5. Код: pascal 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2020, 19:49 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
ВсеРазумный подразумевалось Код: pascal 1. ты сможешь передать в процедуру только переменную типа строго TObject ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2020, 19:51 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Maxim Rusov, для гурманов наслаждений обязательно ещё и такое: Код: pascal 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2020, 22:00 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
ВсеРазумный Ну не просто так же было в оригинале написано (var Obj) скорее всего, подразумевалось что, можно вызвать не только для объекта с наследником TObject Ээ... а разве в дельфи могут существовать объекты - не наследники TObject (class, не object)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2020, 22:47 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Bred eFeM Maxim Rusov, для гурманов наслаждений обязательно ещё и такое Зачем? Для потокобезопасности? Это бессмысленно. Для того того чтобы записать в одну строчку? Aтомарные функции - тормозные. Нет, это нам не нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2020, 00:31 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
FreeAndNil вообще не нужен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2020, 00:38 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
rgreat, Чой то? Очень даже нужен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2020, 00:40 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Я не пользуюсь. Зачем? Дурная функция какая-то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2020, 00:40 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Хорошая функция (а моя - еще лучше). 3-в-1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2020, 00:45 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Maxim Rusov Достало, что в FreeAndNil можно по ошибке передать что угодно и компилятор это никак не проверяет. Решил исправить. Делает тоже самое, но передавать можно только объекты. Наслаждайтесь. Зато ваша не проверяет такой косяк: Код: pascal 1. 2. 3. 4. 5. 6. Компилятор не ругнётся, а потом будет сюрприз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2020, 01:04 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
rgreat Я не пользуюсь. Зачем? Дурная функция какая-то. Что, никогда не использовали объектные переменные, которые содержат ссылки на динамически создающиеся объекты?.. Типа Код: pascal 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2020, 01:08 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
alekcvp, у меня объект может быть nil только на старте, пока не инициализируется. В процессе работы убитые объекты с "висящими" или пустыми ссылками я стараюсь просто не допускать. ИМХО это принципиально убирает возможность где-то накосячить с этими ссылками в будущем. В случаях исключений я явно присваиваю ссылке nil, без всяких кривых FreeAndNil. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2020, 01:24 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Maxim Rusov Для потокобезопасности? Это бессмысленно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2020, 02:46 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
FreeAndNil для сомневающихся, только DestroyAndInvalidate/FreeAndInvalidate ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2020, 09:33 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
rgreat alekcvp, В случаях исключений я явно присваиваю ссылке nil, без всяких кривых FreeAndNil. А в чём он кривой? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2020, 14:33 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
alekcvp, 2 презерватива лучше, чем 1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2020, 16:28 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
ВсеРазумный 2 презерватива лучше, чем 1 Не лучше, а безопаснее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2020, 16:36 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
wadman ВсеРазумный 2 презерватива лучше, чем 1 Не лучше, а безопаснее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2020, 17:22 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
alekcvp А в чём он кривой? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2020, 17:24 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
rgreat, Вообще - то никаких приведений нет, к типам. В asm будут только адреса. А приведения нужны, что бы по offset определённого класса, обращаться к нужным элементам в памяти ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2020, 17:56 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
ВсеРазумный Вообще - то никаких приведений нет <..> а приведения нужны, что бы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2020, 18:16 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
rgreat Содомия с промежуточной ссылкой и приведением типов через указатели. А в промежкточной ссылке - большой смысл. Просто ты его еще не постиг. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2020, 18:28 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
rgreat, Ну что же делать если ты такой глупенький. Имелось введу после компиляции. И потом пояснялось что до компиляции самого кода, приведения нужны дабы обозначить область информационной структурированной базы. В главном сообщение Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. AtomicExchange Код: pascal 1. 2. 3. 4. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Тут то мы и видим заветное приведение TObject.Free Точно так же, как и в оригинальной функции Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Подмечаем тот факт, что никаких приведений не было. В любом случае, объект лежит в eax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2020, 18:33 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Добавлю сами вызовы Из поста Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. AtomicExchange Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. Оригинал Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. Вызов идентичный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2020, 18:36 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
inline из поста Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. inline AtomicExchange Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. inline org Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2020, 18:39 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Как по мне, мне в любом случае нравится lock xchg от AtomicExchange ибо ручками написать Код: pascal 1. 2. В реально рабочем коде, он всё равно вставит свою mov eax,ebx Код: sql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2020, 18:47 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Maxim Rusov, В рамках функции FreeAndNil - смысл есть. Нет смысла в самой этой функции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2020, 19:23 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
ВсеРазумный Ну что же делать если ты такой глупенький. Имелось введу после компиляции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2020, 19:26 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Меня только сам паскаль интересует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2020, 19:37 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
rgreat, Удаляй Delphi. Это тебе не паскаль. Это Delphi) Какой смысл использовать язык Delphi)))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2020, 20:59 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
ВсеРазумный, https://en.wikipedia.org/w/index.php?title=Delphi_language&redirect=no Открой и окатись знанием. Языка "Delphi" больше не существует. На этом все, или еще идиотские комментарии будут? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2020, 22:09 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
rgreat, Ахахах)))) Смешно - смешно. Его не может Не существовать https://ru.wikipedia.org/wiki/Delphi_(язык_программирования) Выпуск Delphi 10.3.2 Rio (18 июля 2019) Ты хоть понимаешь, что сам компилятор Ну ОН СОВЕРШЕННО ничего общего не имеет с паскалевским. А ты думал так легко деньги зарабатываются ? Взяли компилятор паскаля, добавили пару фич и давай на нём зарабатывать. Смешной ты типок. "Этот язык программирования является диалектом языка Object Pascal." Из Вики ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2020, 22:26 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Да, именно что. В Delphi совершенно не имеет ничего общего к компилятору Паскаля. Схожий только синтаксис. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2020, 22:28 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
По твоей логики. Завтра Какой то Вася выпускает диалект языка Паскаля. А к вечеру все такие - ГОУ Его в рейтинг вместе с Pascal\Delphi\И какашка выполняющая аналог паскаля. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2020, 22:30 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
ВсеРазумный, Вообще это все не интересно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2020, 23:11 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
авторEmbarcadero changed the signature of FreeAndNil() in 10.4 Denali: procedure FreeAndNil(const [ref] Obj: TObject); inline; https://github.com/IndySockets/Indy/commit/96efd9d4b381ae8531f4756943eb083a41091dcd#diff-fa875d4568a8bcd0f0d1d80726182cdbR1923 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2020, 09:29 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Читают SQL.ru! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2020, 10:09 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
zedxxx авторEmbarcadero changed the signature of FreeAndNil() in 10.4 Denali: procedure FreeAndNil(const [ref] Obj: TObject); inline; Напомните, а что выделенное дает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2020, 10:10 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Квейд zedxxx пропущено... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2020, 10:37 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Принудительно передает параметр по ссылке, независимо от типа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2020, 10:38 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Maxim RusovЧитают SQL.ru! Это старый тикет - RSP-27208 . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2020, 20:36 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Этот вариант FreeAndNil позволяет его вызывать с не-lvalue, как то свойства, результаты функций. Но если выбирать между type-safety и lvalue-safety, то я однозначно за type-safety. Сколько багов в мире существует из-за этого ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2020, 20:50 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Dmitry Arefiev Этот вариант FreeAndNil позволяет его вызывать с не-lvalue, как то свойства, результаты функций. Имхо, это ничем не плохо и в некоторых редких ситуациях удобно. Ровно как и оригинальный вариант - ничем не плох и в некоторых ситуациях удобен. Лично по мне, всё это "улучшение" сугубо теоретическое, на практике FreeAndNil более чем хорош, проблем с ним я в жизни не видел, и чтобы их организовать, нужно такое выдающееся головотяпство, что, мягко говоря, не на зеркало стоит пенять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2020, 21:19 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Тебе повезло, что ты с ним никогда проблем не видел. Не все такие визучие ... Я видел много случаев освобождения динамических и не только массивов, интерфейсов и тд. Классический пример - был класс, его рефакторили в интерфейс, про FreeAndNil забыли или не все места нашли. То что новый вариант не lvalue-safe, приведет к другим багам, но в меньшем кол-ве. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.05.2020, 10:56 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Dmitry Arefiev Тебе повезло, что ты с ним никогда проблем не видел. Не все такие визучие ... Месяца через три после того, как я в первый раз стал начальником отдела, я встал перед необходимостью уволить двоих программистов. На их примере я выработал простой принцип: не брать себе в подчинение тех людей, которых не я собеседовал и не я выбирал. С тех пор, то есть уже где-то шестнадцать лет, я не уволил ни одного человека. Необходимости не было. Видимо, тех, с кем она возникла бы, я отсеиваю ещё на собеседовании. Очень везучий. Dmitry Arefiev Классический пример - был класс, его рефакторили в интерфейс, про FreeAndNil забыли или не все места нашли. Это да, такими странными вещами я не занимаюсь. В том числе поэтому мне и везёт. Dmitry Arefiev То что новый вариант не lvalue-safe, приведет к другим багам, но в меньшем кол-ве. Если налить в чайник раствор серной кислоты и прокипятить, довольно велик риск неприятных последствий. Но это не значит, что чайник плох и приводит к багам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.05.2020, 14:47 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Так разговор не про крайние случаи, типа серная кислота в чайник, а про среднюю температуру по больнице. Ты имеешь право, как везучий, определить FreeAndNil как тебе удобнее, или ожидать от своих правильного использования. Эмба же не начальник никому, поэтому улучшили определение ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.05.2020, 15:24 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Да улучшила и улучшила, почему бы и нет. Ну, может, отвалится какой-нибудь код двадцатилетней давности, типа FreeAndNil(TreeNode.Data), так, мягко говоря, не жалко. Просто, имхо, здесь нечего обсуждать на три страницы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.05.2020, 15:37 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
softwarer Да улучшила и улучшила, почему бы и нет. Ну, может, отвалится какой-нибудь код двадцатилетней давности, типа FreeAndNil(TreeNode.Data), так, мягко говоря, не жалко. Просто, имхо, здесь нечего обсуждать на три страницы. А FreeAndNil(TObject(TreeNode.Data)) прокатит?.. И разве Pointer можно передать как 'var Obj: TObject' ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2020, 13:39 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
alekcvp softwarer Да улучшила и улучшила, почему бы и нет. Ну, может, отвалится какой-нибудь код двадцатилетней давности, типа FreeAndNil(TreeNode.Data), так, мягко говоря, не жалко. Просто, имхо, здесь нечего обсуждать на три страницы. А FreeAndNil(TObject(TreeNode.Data)) прокатит?.. Думаю, прокатит. И это будет хорошо и правильно. alekcvp И разве Pointer можно передать как 'var Obj: TObject' ? Я лет двадцать не смотрел в декларацию FreeAndNil. Мои воспоминания о том, что там просто бестиповая переменная, отстали от жизни? Насколько я помню, var мешает употребить там TObject. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2020, 14:17 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
alekcvp И разве Pointer можно передать как 'var Obj: TObject' ? Я лет двадцать не смотрел в декларацию FreeAndNil. Мои воспоминания о том, что там просто бестиповая переменная, отстали от жизни? Насколько я помню, var мешает употребить там TObject.[/quot] Да, действительно, там просто var Obj; ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2020, 17:59 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
alekcvp А FreeAndNil(TObject(TreeNode.Data)) прокатит? Проблема в том, что он может и откомпилируется, но будет тихо глючить. Типа объект уничтожается, а Data не обнуляется. По крайней мере одну такую ошибку я словил. Глюк в компиляторе, наверное. Так что я остановился на таком варианте: procedure FreeObj(const [ref] Obj :TObject); overload; inline; procedure FreeObj(const [ref] Obj :Pointer); overload; inline; Интересно, до этого эмба додумалась? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2020, 20:39 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Что мешает просто сделать: Код: pascal 1. 2. Зачем нужен этот кривой костыль с FreeAndNil? Неужели это все только ради того чтобы одну строчку сэкономить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2020, 20:51 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
rgreat Что мешает просто сделать: Код: pascal 1. 2. Зачем нужен этот кривой костыль с FreeAndNil? Неужели это все только ради того чтобы одну строчку сэкономить? этот вопрос и меня занимает) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2020, 21:09 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Не используете - проходите мимо. Не мешайте ценителям обсуждать высокие материи. 1. FreeAndNil имеет эстетическую ценность. 2. В нем большой практический смысл, заключающийся в локальной переменной. Просто вы его еще не постигли (кажется я это уже писал?...) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2020, 21:23 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
rgreat Что мешает просто сделать: Код: pascal 1. 2. Зачем нужен этот кривой костыль с FreeAndNil? Неужели это все только ради того чтобы одну строчку сэкономить? Что будет, если внутри TObject(TreeNode.Data).Destroy случится исключение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2020, 22:48 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
alekcvp, Если может случится исключение то ясное дело что его надо обрабатывать. Как и в случе FreeAndNil. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2020, 22:49 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
rgreat Зачем нужен этот кривой костыль с FreeAndNil? Как он может быть кривым? По твоей логике, все функции кривые. Которые требуют правильного заполнения. Которые ты можешь неверно заполнить, или неверно передать значение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2020, 22:54 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Возможно rgreat когда то обжёгся в сях с макросами, а в сях с плюсами с шаблонами. Теперь они универсальные функции боится как раскалённой палки, которая бьёт по спинке ломая хребет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2020, 23:01 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
ВсеРазумный Как он может быть кривым? Проблемы разных реализаций и применений этой процедуры тут уже несколько страниц обсуждают. Не говоря уже о том что при вгляде на содержимое этой процедуры меня просто эстетически корежит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2020, 23:14 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
rgreat alekcvp, Если может случится исключение то ясное дело что его надо обрабатывать. Как и в случе FreeAndNil. Только в случае FreeAndNil() указатель будет обнулён, а в вашем варианте - нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.05.2020, 01:02 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
rgreat, Ой да ладно. Корёжит вас. Компилятору как то, ну вообще пофиг. Что вы напишите ручками, что вы заюзаете данную функцию. По итогу будет аналогичный код. А то что, кто - то не внимательный, и пихает в неё всё подряд - это его вина. Такой человек вообще, вряд - ли напишет рабочий продукт хотя бы на 2% И уже проблема не в функции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.05.2020, 01:07 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
alekcvp, Указатель-то обнулен, а вот сам объект не[до]освобожден. Вот и думай. что хуже.)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.05.2020, 01:11 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
alekcvp Только в случае FreeAndNil() указатель будет обнулён, а в вашем варианте - нет. Очистка объекта не завершена а указатель уже обнулен. Мы имеем утечку памяти и все предпосылки к сбою, в случае если если это не до убитый поток или нечто с этим связанное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.05.2020, 01:39 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Vlad F Указатель-то обнулен, а вот сам объект не[до]освобожден. Вот и думай. что хуже.)) Нечего думать. Необнулённый указатель гораздо хуже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.05.2020, 21:42 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
softwarer Vlad F Указатель-то обнулен, а вот сам объект не[до]освобожден. Вот и думай. что хуже.)) Нечего думать. Необнулённый указатель гораздо хуже. И это всего лишь твое неподкрепленное частное мнение.)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.05.2020, 22:30 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Vlad F, у тебя есть какая-то веская причина зомби ссылки хранить? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2020, 01:06 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2020, 01:30 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Да ну вас в попу Код: 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. Код: sql 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2020, 01:53 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Vlad F И это всего лишь твое неподкрепленное частное мнение.)) Лет пятнадцать назад я разработал одну программу, предназначенную работать 24x7x365. Через некоторое время тогдашний начальник решил усилить надёжность и сказал другому программисту сделать программу-монитор, которая каждые несколько минут проверяла бы, работает ли моя программа, и если она упала - перезапускала бы её. В итоге выяснилось, что программа-монитор каждые неделю-две падает, в то время как моя программа спокойно продолжает работать. Так вот, я не сомневаюсь, что автор того монитора был бы с тобой согласен :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2020, 09:26 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
makhaon Vlad F, у тебя есть какая-то веская причина зомби ссылки хранить? :) Дык, в общем случае нельзя будет сказать на сколько они в этом случае зомби.)) Говорю же, и концептуально и стилистически ни один из этих подходов не лучше. Оба хуже, имхо. И уж, как минимум, один другого стоит.)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2020, 11:15 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
softwarer Vlad F И это всего лишь твое неподкрепленное частное мнение.)) Лет пятнадцать назад я разработал одну программу, предназначенную работать 24x7x365. Через некоторое время тогдашний начальник решил усилить надёжность и сказал другому программисту сделать программу-монитор, которая каждые несколько минут проверяла бы, работает ли моя программа, и если она упала - перезапускала бы её. В итоге выяснилось, что программа-монитор каждые неделю-две падает, в то время как моя программа спокойно продолжает работать. Так вот, я не сомневаюсь, что автор того монитора был бы с тобой согласен :) А в огороде бузина, а в Киеве - дядька.))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2020, 11:16 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
ВсеРазумный Я думаю от перестановки действий, ничего не меняется. ВсеРазумный Да ну вас в попу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2020, 18:28 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
white_nigger, То есть проблема в дурочке программисте, а не в функции. Ибо уничтожив объект, у него бы осталась ссылка на объект, при использование в последующем, с вылетом в AV Хватит сосать проблемы из пальца. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2020, 19:18 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
ВсеРазумный То есть проблема в дурочке программисте ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2020, 19:48 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
white_nigger что ты хотел показать тем постом с дизассемблером? От переустановки действий, слагаемое не меняется. 22126998 white_nigger Абсолютно тоже самое можно сказать о необходимости использования костыля FreeAndNil Вообще, бездумное освобождения объекта - признак слабоумия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2020, 20:17 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Если мы вешаем динамически созданные объекты на форму - owner, то форма в конце программы уничтожит данные объекты. И освобождение не нужно. Но если мы планируем динамическое GUI с перезагрузкой и добавлением элементов GUI то имеет смысл, удалять объекты, дабы не загружать всю память программы. И помечать ссылки в массиве объектов - null маркером. Дабы понимать какой сейчас объект может использоваться И не нарваться на AV от уже освобождённого объекта. Будет полезен вызов FreeAndNil ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2020, 20:20 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
ВсеРазумный, да-да, а ещё с дури можно и хрен сломать. Разница в коде есть, если не видишь - учи ассемблер. PS: и тебе не стоит мне объяснять как работают визуальные компоненты))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2020, 21:12 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
white_nigger, Нет никакой разницы. Когда объект освобождён, хранить ссылку не имеет смысла. Это мёртвый объект, вызвав у которого метод\свойства. Будет тот же самый AV. И уж тем более не имеет смысла, в каком порядке обнулять ссылку на объект. Код: 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. Имеем удаление через Free с последующим обращением к объекту. И аналогично FreeAndNil EAccessViolation : Access violation at address 005E929F in module 'Project1.exe'. Read of address 000003CC EAccessViolation : Access violation at address 005E929F in module 'Project1.exe'. Read of address 000003CC EAccessViolation : Access violation at address 005E8F57 in module 'Project1.exe'. Read of address 00000010 Прекрасно видим, что функция FreeAndNil вообще не причём. И мешает только тому, у кого руки из попы. 0 разница. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2020, 23:07 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Самый лучший отладчик в мире. По break выкидывает вообще не туда, куда надо. Это обречённость неумелых рук, из попы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2020, 23:10 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2020, 23:12 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Вот такой баг, с не обнулённой переменной. Вы будете всей командой - пол года искать. Так что кушайте функцию FreeAndNil и не парьтесь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2020, 23:32 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Тут прибежали санитары и зафиксировали нас. (с) ВСВ)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2020, 23:40 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
ВсеРазумный Так что кушайте функцию FreeAndNil и не парьтесь. "Люди делятся на две категории: те, кто делает бэкапы, и те, кто уже делает бэкапы" Было время, когда FreeAndNil не было. Она появилась довольно поздно, не то в пятой, не то в шестой дельфе. Поэтому дельфи-программисты делились на тех, кто использует аналогичную самописную подпрограмму, и на тех, кто уже использует аналогичную самописную подпрограмму. Я был из первых - потому что ещё до дельфы, со времён работы на Си, крепко усвоил, насколько это облегчает надёжное кодирование. А потом... со всем, что разрабатывают люди, происходит одна и та же история. Сначала какого-то инструмента нет, и без него довольно плохо. Технология развивается, находит хорошее решение очередной задачи (тот самый инструмент), все счастливы. Потом вырастает поколение, которому этот инструмент и его результаты уже привычны, а вот с проблемами из-за его отсутствия они на своей шкуре не сталкивались. И они начинают говорить, что инструмент плохой, и без него лучше. Дальше они начинают писать без него, и либо умнеют, либо изобретают какой-нибудь плохой велосипед вроде тех, которыми пользовались до разработки этого инструмента, и в зависимости от степени ослиности упрямства держатся за него, порой долго, порой очень долго. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2020, 23:44 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Не помогут санитары. Пациент уже многократно сбегал на свободу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2020, 23:44 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
ВсеРазумный, А представь, что у тебя дальше код идёт: Код: pascal 1. 2. И теперь прогони свои тесты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2020, 23:55 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
ВсеРазумный Вот такой баг, с не обнулённой переменной. Вы будете всей командой - пол года искать. Так что кушайте функцию FreeAndNil и не парьтесь. Такое никогда не возникнет если следовать поставленным парадигмам при разработке архитектуры ПО... 1) Кто объект создал - тот его и разрушает. 2) Создал в конструкторе - разрушь в деструкторе. 3) Создал в методе, разрушь в том же методе. 4) Написал Create пиши сразу Free Все остальные случаи укладываются в эти 4 пункта, если правильно проектировать классы и абстракции... А если кто-то в команде так напишет, будет уволен без выходного пособия лишен премии из-за недостатка квалифицированных кадров, ибо не понимает что делает... Код: pascal 1. 2. 3. Для меня FreeAndNil бессмысленный... реальное его использование 0.1% для глобальных синглтонов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2020, 00:45 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
X-Cite Такое никогда не возникнет если следовать поставленным парадигмам при разработке архитектуры ПО... Интересно, как же следовать этим парадигмам ну хотя бы для разработки простейшего гуёвого Hello, world. Application.CreateForm им не соответствует, да и другие способы создания окон - тоже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2020, 01:58 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
alekcvp ВсеРазумный, А представь, что у тебя дальше код идёт: Код: pascal 1. 2. И теперь прогони свои тесты. Да никогда в жизни такого кода у тебя не будет, потому что ты в одном месте освободишь. А в другой процедуре получишь по попе своей шаловливой. Вот и делай теперь на каждое обращение проверку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2020, 02:37 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
X-Cite, Как видим, он вообще не бессмысленный. Ибо задача приведена на пальцах. А на деле как я уже сказал выше, освобождение может произойти раньше. Тупо просто класс крашнулся выйдя из процедуры - потеряв ссылку. И в конце концов в другой процедуре ты получил по попе. Да, в целях экономии, делается PPointer, что бы мы знали что происходит с другой переменной. А если другая переменная через FreeAndNil получила null то там не придётся потом всей командой пол года искать в чём же проблема. Ибо отладчик скажет где у нас нет данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2020, 02:39 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
ВсеРазумный Да никогда в жизни такого кода у тебя не будет, потому что ты в одном месте освободишь. А в другой процедуре получишь по попе своей шаловливой. Вот и делай теперь на каждое обращение проверку. Если ты не следишь за логикой своего приложения и у тебя в одном месте может освободиться объект, который используется в другом, при этом ты никак его текущее состояние не проверяешь - ну, ССЗБ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2020, 02:49 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
alekcvp, Да хватит пургу гнать. В команде всякое бывает. Классы могут крашитья по разным причинам. Освобождение тоже может происходить спонтанно из за освобождения логики определённого юнита хаотичным образом, из за порядка подключения. Да куча вообще есть подводных комней, почему лучше удалить с пометкой указателя на null Вот один пример - порча памяти приложения Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Данный код хаотично начинал крашить обращения к компонентам, очень долгое время непонятно было почему приложение вылетало. Подправив его вот так, у нас перестали крашиться обращения к классам хаотичным образом Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2020, 02:59 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Надо мыслить на много шире. Приведённые примеры не означают что будет именно так. Так как в действительности - в реальных условиях, я бы даже сказал в суровых. Детская фантазия не всегда поможет. Постоянно может возникать что - то, о чём вы даже не могли и предположить. Так что Я не могу понять, почему обнуление 1 указателя функцией FreeAndNil с последующими возможными ссылками, и конечным освобождённым объектов - для вас какой - то ужас. Я могу предположить что у вас просто нехватка реального опыта с разными проблемами в настоящих проекта (Не подделках в детском саду) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2020, 03:04 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
ВсеРазумный Постоянно может возникать что - то, о чём вы даже не могли и предположить. Это говорит о недостатке опыта вкупе с тягой к экспериментам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2020, 03:09 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
rgreat, Шаблоньюзер ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2020, 03:16 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
ВсеРазумный Постоянно может возникать что - то, о чём вы даже не могли и предположить. Так что Я не могу понять, почему обнуление 1 указателя функцией FreeAndNil с последующими возможными ссылками, и конечным освобождённым объектов - для вас какой - то ужас. Когда в приложении происходит хрен знает что и вы вообще не представляете что там и где освобождается, то проблема не во FreeAndNil, а в архитектуре приложения... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2020, 03:59 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
alekcvp, rgreat ВсеРазумный в данном случае ох как прав когда у вас под контролем будет 7-8 проектов где каждый заходит и топчет, тогда начнёте дуть на воду ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2020, 09:22 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
ВсеРазумный, Разница в том, что вы зачем-то используете Utf8ToUnicode куда надо передавать какие-то указатели... А мы работаем с высокоуровневым кодом, и делаем это проще через Код: pascal 1. 2. Современная дельфи уже давно в некоторых местах позволяет забыть об указателях... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2020, 14:53 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
X-Cite, Данный код, кто - то вытянул из Delphi какой - то версии. В последней версии, вроде как стоит Код: pascal 1. 2. 3. Проблема не в Utf8ToUnicode, ибо она была ликвидирована в первую очередь по такой же причине. Спойлер - проблема не исчезла. Код: pascal 1. В оригинале, в Delphi коде делался inc на переменную P дабы разграничить секции. И каким - то образом, двигался не Pointer указателя, а именно сам UnitNames. Код: pascal 1. Хотя, в новой реализации функция ReadShortString тоже двигает указатель. Странно это. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2020, 15:18 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), Не вижу свзи между безопастностью и freeandnil. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2020, 17:56 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
rgreat, не видишь, предложи замену ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2020, 21:02 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), Код: pascal 1. 2. 3. 4. 5. Ошибки обработать по желанию/необходимости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2020, 21:10 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
По моему вы преувеличиваете Код: 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. Объект обнулён в любом случае. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2020, 23:00 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
rgreat kealon(Ruslan), Код: pascal 1. 2. 3. 4. 5. То есть, если в программе пятьсот мест, где нужно подобным образом освободить объект, Вы пятьсот раз напишете этот код? Или же таки оформите процедуру и вызовете её пятьсот раз? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2020, 23:08 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
softwarer, Как я уже сказал я крайне редко обнуляю указатели как таковые ибо считаю это непрямым и как следствие ненадежным методом контроля состояния объекта. Ссылок на объект может быть больше одной. У меня в 99% случаев nil в указателе может быть только до иннициализации объекта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2020, 23:14 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Объекты я убычно убиваю вместе с бизнес логикой и всеми ссылками, которе на него ссылаются. Так проверять на валидность ничего и не надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2020, 23:23 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
rgreat Как я уже сказал я крайне редко обнуляю указатели как таковые Вы не ответили на вопрос. Руслан Вас спросил, Вы предложили метод, я задал вопрос про этот метод. В нём нет ничего про крайне редко или крайне часто, в нём только про методику использования предложенного Вами метода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2020, 23:34 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Как показала практика, для обнуление объекта try не нужно. И со всеми задачи справляется FreeAndNil А если нужен try то и FreeAndNil со всем справляется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2020, 23:59 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Обнуление переменной до Destroy делается совсем не для обработки исключений. Исключений в деструкторе вообще быть не должно. Это делается, чтобы во время уничтожения объект был недостижим через ссылку, потому что он находится уже в неконсистентном состоянии. Для многих ситуаций это критически важно, и если ссылку не обнулить _до_ Destroy программа будет глючить. Конечно, в первую очередь это имеет смысл для интерфейсов - обнуление интерфейсной переменной работает так-же как FreeAndNil - для объектов обнуляемая ссылка не факт, что последняя и объект может быть достижим через другие ссылки. Но тем не менее - это принципиальный момент. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2020, 00:13 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Maxim Rusov, А кто сказал, что обнуление переменной до Destroy делается для обработки исключений? Эк, вас всех, парни, однако, разобралО. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2020, 01:43 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Vlad F, Раз 22126803 Два 22127835 В общем тут каждый друг друга путает, наводит кипишь на пустом месте. И из маленькой пылинки раздувает опухоль со слона. Мифы создают ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2020, 01:51 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Санитары, как вижу, не справились. Вызывайте уже пожарных что-ли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2020, 01:54 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
softwarer, Еще раз. Метод вообще на мой взгляд не нужен, по этому на мой обсуждать какой из них лучше это не.более чем разминка для мозга. Такое мнение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2020, 02:20 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Maxim Rusov Исключений в деструкторе вообще быть не должно. . Я у себя в сервисах try-ями обкладываю вообще все. Даже то что сломаться якобы не может. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2020, 02:22 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
rgreat, Я буду прост. - Это диагноз. Vlad F Санитары, как вижу, не справились. Вызывайте уже пожарных что-ли. Переборщили с вами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2020, 02:42 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
В общем кого - то надо отправить повторно изучать Try-Except-on&do ибо я сейчас пытаюсь вызвать исключение в конструкторе с выкидом в деструктор, и в нём же созданием исключения разными способами. И Try-Except-on&do справляется с отловом исключения через овер 100 функций и классов, находя место исключения с использованием разного в том числе и FreeAndNil c пометкой EInvalidPointer с сообщением : Invalid pointer operation Проблем нет, кривизна функции FreeAndNil не доказана. А польза 100% тем более это inline и не является функцией в рабочем коде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2020, 02:53 |
|
||
|
Улучшил 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 |
|
||
|
Улучшил 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 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2020, 02:04 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Dmitry Arefiev Вам на ночь глядя: https://www.google.com/search?client=firefox-b-d&q=nick hodges freeandnil Комментарий на рандомном сайте прикольный: знаем, знаем. это тот ник, который учит всех не использовать FreeAndNil потому что “а зачем?”. баааальшой спец, которого даже из такой сомнительной конторы как эмбаркадеро поперли.:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2020, 02:06 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
asviridenkov, Ну всё правильно для JS если один node является строкой, то происходит concat. Притом, на стадии пред компиляции происходить проверка, является ли строка - строкой ? Или же это число, или что - то ещё. Но вот для других языков 4 == "4text" будет = true так же как и 8 в сложение. Но вот если строка идёт спереди "text4", то она не является числом, и мы не можем получить concat в виде 44text и получаем просто 4 Это азы, это знать надо перед тем как начать программировать на языке (Уточнив приоритеты) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2020, 03:01 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
ВсеРазумный, a+b <> b+a ну да, все верно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2020, 03:10 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
asviridenkov, javascript 44 == "44" = true 44 == "44d" = false Возьмём к примеру php 44 == "44" = true 44 == "44d" = true 44 == "d44" = false 44 + "44" = 88 44 + "44d" = 88 44 + "d44" = 44 Для js будет понятно, что там в любом случае concat string ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2020, 03:19 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
В lua к примеру со строкой вообще нельзя сравнить число, будет false ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2020, 03:27 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Господа, вы немного не в том направлении ушли :) Обсуждение той статьи заслуживает отдельной ветки, даже может быть и в разделе Delphi, но лучше - в разработка, я с ней полностью согласен, но это не тема топика. Ссылка была приведена только для главного посыла:авторПотому что это частный случай задачи коммивояжера — ты НИКОГДА не можешь предусмотреть все кейсы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2020, 09:24 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
ВсеРазумный 44 + "44" = 88 44 + "44d" = 88 44 + "d44" = 44 Пц... и на этом ещё пишут... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2020, 14:03 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
alekcvp, раз уж хочется об этом поговорить, можно вот еще пару тем глянуть :) https://habr.com/ru/post/500098/ https://habr.com/ru/post/500822/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2020, 14:19 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
alekcvp Пц... и на этом ещё пишут... Нормально и пишут.Это никаких неудобств не доставляет, зная как с этим работать. Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Это всё написанно на официальном сайте https://www.php.net/manual/ru/language.types.php Ознакомление составляет 20 минут в среднем ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2020, 15:05 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Это всё написанно на официальном сайте https://www.php.net/manual/ru/language.types.php Ознакомление составляет 20 минут в среднем[/quot] Значение определяется по начальной части строки. Если строка начинается с верного числового значения, будет использовано это значение. Иначе значением будет 0 (ноль). Верное числовое значение - это одна или более цифр (могущих содержать десятичную точку), по желанию предваренных знаком с последующим необязательным показателем степени. Показатель степени - это 'e' или 'E' с последующими одной или более цифрами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2020, 15:06 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Товарищи, который топят против FreeAndNil почему-то считают, что если вы его используете - то это только потому, что структура кода требует его использовать. Иными словами, они считают, что если вы используете FreeAndNil - то у вас ужасная неразбериха в коде, вы сами не знаете область жизни ваших объектов. И в этом они, конечно, правы. Видимость объектов нужно максимально сужать, код нужно упрощать, минимизируя зависимости. Но почему я не могу одновременно иметь нормальную архитектуру и при этом использовать FreeAndNil - мне не понятно. Я подозреваю, что эти товарищи получили детскую травму, работая с подобным кодом. Это примерно как если бы вы работали с "лапшой на GOTO" и написали "Доводы против оператора GOTO". Просто когда другие читают такие опусы, они не вполне понимают, про что говорит автор, потому что никогда не видели подобного кода - ну и понимают сказанное слишком буквально ("удалите вообще это из языка"). Но я вот, к примеру, не видел на практике ни лапши на GOTO, ни FreeAndNil как затычки (да, может быть, мне повезло), зато видел множество случаев, когда и GOTO и FreeAndNil - уместны. Аргумент: "если у вас правильная архитектура, то FreeAndNil не нужен". Да, не нужен, но никто же не запрещает. Как они собираются гарантировать "правильность" кода - мне не понятно. Человек склонен совершать ошибки. FreeAndNil - это машина, инструмент, она ошибок не делает. Его вызов не несёт каких-то накладных расходов, чтобы от него избавляться. У нас не так много отладочных инструментов, чтобы добровольно отказываться от них. Также наблюдается некое двуличие. Многие аргументы "против FreeAndNil" применимы также и к Free. Действительно, очень часто достаточно просто Destroy. Почему анти-FreeAndNil товарищи не топят против Free? Когда вообще вы последний раз задумывались: "хм, а здесь нужен Free или достаточно Destroy?" А зачем тогда вы вообще задумываетесь "хм, а здесь нужен FreeAndNil или достаточно Free?" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2020, 15:13 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
GunSmoker Товарищи, который топят против FreeAndNil почему-то считают, что Товарищи, которые топят против FreeAndNil, считают, что в автомобиле пристёгивается только тот, кто не умеет водить. Ну а настоящим пацанам западло, корона спадает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2020, 15:50 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
GunSmoker часто достаточно просто Destroy ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2020, 16:10 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
vavan GunSmoker часто достаточно просто Destroy Кстати, хороший вопрос для собеседования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2020, 16:16 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
softwarer, Это только если вам на собеседовании нечем заняться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2020, 16:46 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
GunSmoker Также наблюдается некое двуличие. Многие аргументы "против FreeAndNil" применимы также и к Free. Действительно, очень часто достаточно просто Destroy. Почему анти-FreeAndNil товарищи не топят против Free? Когда вообще вы последний раз задумывались: "хм, а здесь нужен Free или достаточно Destroy?" А зачем тогда вы вообще задумываетесь "хм, а здесь нужен FreeAndNil или достаточно Free?" а потом появилась ему замена, в виде FreeAndNil практически Free уже не нужен, я не могу придумать ему адекватный кейс для применения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2020, 16:48 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), Код: pascal 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2020, 16:51 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
kv67 kealon(Ruslan), Код: pascal 1. 2. 3. 4. 5. 6. Код: pascal 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2020, 17:14 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan) kv67 kealon(Ruslan), Код: pascal 1. 2. 3. 4. 5. 6. Код: pascal 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2020, 17:49 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Вообще у всего есть семантика и контракт. Кому это не важно, для того эти три варианта одинаковы. Кому важно, заботится о читаемости и логичности кода, для того эти три варианта существенно разные. Кто ты ? :) Код: pascal 1. 2. 3. 4. 5. 6. Код: pascal 1. 2. 3. 4. 5. 6. Код: pascal 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2020, 17:59 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Я - тот, кто заботится о качестве продукта. Поэтому в заданных условиях однозначно предпочту четвёртый вариант, Код: pascal 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2020, 18:23 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
ЭМ.. Free проверяет существует ли объект, и вызывает Destroy Так что не имеет никакого смысла вызывать Destroy. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2020, 18:24 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Кот шрёдингера он либо жив, либо мёртв. Никогда нельзя предугадать на 100% всего лишь на 99,999 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2020, 18:25 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
ВсеРазумный Так что не имеет никакого смысла вызывать Destroy. Небольшой смысл всё же имеет. За него в коде цепляется глаз, поэтому если хочешь просигнализировать читателю "здесь что-то необычное", стоит предпочесть его Free - как, например, в моей предыдущей реплике. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2020, 18:27 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
softwarer Я - тот, кто заботится о качестве продукта. Поэтому в заданных условиях однозначно предпочту четвёртый вариант, Код: pascal 1. 2. 3. Уникальный путь нормален для России :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2020, 18:41 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
GunSmoker Это примерно как если бы вы работали с "лапшой на GOTO" и написали "Доводы против оператора GOTO". Просто когда другие читают такие опусы, они не вполне понимают, про что говорит автор, потому что никогда не видели подобного кода - ну и понимают сказанное слишком буквально ("удалите вообще это из языка"). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2020, 22:55 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
bk0010, Ну goto это while и for и всё остальное. А рекорды это и есть массивы, после компиляции не найдёшь отличий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2020, 23:28 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
ВсеРазумный bk0010, Ну goto это while и for и всё остальное. А рекорды это и есть массивы, после компиляции не найдёшь отличий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2020, 00:10 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Dmitry Arefiev Вообще у всего есть семантика и контракт. Кому это не важно, для того эти три варианта одинаковы. Кому важно, заботится о читаемости и логичности кода, для того эти три варианта существенно разные. Если это важно, никто не мешает делать Код: pascal 1. 2. 3. Можно даже до D F N сократить, а то кто-то ещё аргумент приводит "Free печатать быстрее". P.S. Я, может, сильно необъективно смотрю, у меня проф предпосылки: как техподдержке трейсера исключений - часто приходится отлаживать за клиента. Просто иногда действительно прямо уе**ть хочется тому, кто FreeAndNil не поставил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2020, 00:56 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2020, 01:00 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Проблема, которая находится за секунды, если бы кто-то сильно умный использовал бы FreeAndNil, превращается в многочасовой марафон за багами. P.S. Также ещё пару раз встречал ситуацию, когда надо дополнить сторонний код, но это сделать невозможно, потому что, опять же, не обнулили поля объекта. Приходится городить монстров по проверке валидности указателя. Хотя тут, конечно, не так однозначно, ибо всегда можно сказать, что подобное расширение автором кода не предусматривалось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2020, 01:10 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Даже в таком маленьком проекте 3D движка, сделали обнуление полей https://github.com/seriva/GenesisDevice-2010/blob/63c93cf169a85f5327d36b5e4497811edb60544c/Source/Engine/General/Base.pas#L112 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2020, 01:20 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
GunSmoker Хотя тут, конечно, не так однозначно, ибо всегда можно сказать, что подобное расширение автором кода не предусматривалось. Это как раз про то, что я выше назвал "хороший вопрос для собеседования". Более-менее опытный программист знает, что удачный проект живёт своей жизнью и за исключением отдельных узких стабильных случаев "предусматривать" его развитие скорее вредно - всё равно оно пойдёт существенно не так. Если разумная доработка требует несоразмерно больших затрат из-за того, что "автором не предусматривалось" - значит, код плохой. С Destroy это связано следующим образом. Если соискатель говорит "использую Destroy, потому что здесь никогда не будет nil", следует выяснить, насколько это "никогда" выдержит проверку будущими непредсказуемыми доработками. И если где-нибудь прозвучит "Ну программист же должен был проверить все места, где используется объект, и увидеть, что теперь надо заменить Destroy на Free" - выше мида ему точно делать нечего. GunSmoker Я, может, сильно необъективно смотрю, у меня проф предпосылки: как техподдержке трейсера исключений - часто приходится отлаживать за клиента. Просто иногда действительно прямо уе**ть хочется тому, кто FreeAndNil не поставил Почему же необъективно? Наоборот. Помнится, единственным минусом FreeAndNil называли её потенциальную опасность при вызове с левыми аргументами. Вот и скажите, кого Вам больше хочется воспитать: "тех, кто не поставил FreeAndNil и создал проблему" или "тех, кто поставил FreeAndNil и создал проблему". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2020, 15:05 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
А почему бы в Destroy или Free не вставить об'nil'ение объекта? Я понимаю, что это как будто отпилили сук, на котором сидели... но "магия компилятора" и всё такое... Ведь если уничтожить объект не занилив его - можно тоже получить потом в лоб. Я про то, чтобы при компелиции это было так по умолчанию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2020, 15:45 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Sergey1979 А почему бы в Destroy или Free не вставить об'nil'ение объекта? Я понимаю, что это как будто отпилили сук, на котором сидели... но "магия компилятора" и всё такое... Вставьте. Возьмите тот же Free Pascal с открытыми исходниками и добавьте в него такую функциональность. И когда она заработает, причём во всех режимах, включая, например, Код: pascal 1. 2. 3. задайтесь вопросом: а нафига было так делать то, что куда лучше и без всякой магии решается одной за две минуты написанной процедурой? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2020, 15:50 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Но ведь Free проверяет объект на nil. Если я ничего не путаю. Да, с запретом - я немного не так выразил свою мысль. Хорошо. Я Вас понял и вопросов больше нет. Написать где нужно FreeAndNil не проблема... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2020, 15:53 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Sergey1979, запретите. Сугубо ради любопытства и пополнения статистики хотелось бы спросить - какое у Вас образование? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2020, 15:57 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
И всё-таки Вы написали глупость - СЕЙЧАС, по ряду причин, уже НЕЛЬЗЯ менять поведение по-умолчанию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2020, 17:13 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
softwarer Помнится, единственным минусом FreeAndNil называли её потенциальную опасность при вызове с левыми аргументами. Код: 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. И никакой опасности что, кто - то попытается int\string\... Освободить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2020, 18:16 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
ВсеРазумный, в этом коде на каждое освобождение объекта - минимум один вызов в ядро, а то и больше. Вызов ядра - это очень медленно. Такой код просто так применять нельзя. Гораздо лучше - как в начале топика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2020, 18:36 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
GunSmoker, Мы же не собираемся 1000 раз вызывать в секунду. Нормально! И безопасно! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2020, 21:12 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
GunSmoker, Кстати, было бы не плохо, что бы хранились созданные объекты в каком нибудь списке. Что бы имелась возможность просмотреть и проверить на данный момент, валидные адреса ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2020, 21:18 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Такой список рискует стать очень узким местом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2020, 21:22 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
ВсеРазумный Нормально! И безопасно! Хрень. Проверка должна быть на этапе компиляции. Этот код ничем не поможет, если он не вызовется. Например - где нибудь в редкой except части. Точно так-же гикнется в продакшене, что мы имеем и без этих хлопот. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2020, 21:43 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
ВсеРазумный GunSmoker, Кстати, было бы не плохо, что бы хранились созданные объекты в каком нибудь списке. Что бы имелась возможность просмотреть и проверить на данный момент, валидные адреса Вот многопоточные приложения-то охренеют... И, кстати, FastMM вроде память выделяет блоками и у них есть данные блока в начале (как у дин. массивов), можно покопаться если делать нечего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2020, 00:37 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
alekcvp, Есть же threadvar и к тому же, если не использовать TList а обычный Arr[Pointer mod SizeArr] с пометкой ключа в true\false то это не так уж и медленно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2020, 01:11 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
Что только на свечку не натянут ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2020, 11:00 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
ВсеРазумный, что бы получить vmt нужно прочитать то на что ссылается "указатель", т.е. прочитать непонятно что И скрытие проблемы это гораздо хуже, нужно сразу ексепшн давать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2020, 20:35 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), Причём тут VMT ? Он не нужен. При create записывается индекс в массив о том, что такой адрес создан. И при destructor обнуляется. В PHP такие индексные массивы только в путь и используются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2020, 20:59 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
А мне вот стало интересно, а что быстрее. Массивы в PHP или массивы в Delphi.. На досуге проверю. Разумеется с чистым общением ZendAPI без интерпретатора. Дабы знать на сколько поссосанная система в Delphi ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2020, 21:33 |
|
||
|
Улучшил FreeAndNil. Можете не благодарить.
|
|||
|---|---|---|---|
|
#18+
ВсеРазумный kealon(Ruslan), Причём тут VMT ? Он не нужен. При create записывается индекс в массив о том, что такой адрес создан. И при destructor обнуляется. В PHP такие индексные массивы только в путь и используются. а это что? Код: pascal 1. 2. ссылка на VMT, она в выделенном куске памяти и хранится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2020, 11:43 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2038337]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
60ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
168ms |
get tp. blocked users: |
2ms |
| others: | 242ms |
| total: | 509ms |

| 0 / 0 |
