|
|
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
На форуме встретил эту фразу: “Если в конструкторе произойдет исключение, то неявно вызовется деструктор” Я не уловил, как это работает на практике. Вот пример: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Собственно вопрос в примере. Поделитесь вашими мыслями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2019, 12:17 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
Artem.1st, 1. Для недоконструированного объекта будет вызван деструктор (так проще) 2. Исключения в деструкторах - харам 3. Во избежание исключений при попытке уничтожить несконструированный объект следует вызывать метод Free, вместо прямого вызова деструктора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2019, 12:23 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, спасибо за ответ. Пожалуйста, поясните про п.2 "Исключения в деструкторах - харам" Что это значит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2019, 12:31 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
Artem.1stЧто это значит? Это значит запрещены. То есть, код в деструкторе не должен приводить к необработанным исключительным ситуациям. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2019, 12:37 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey3. следует вызывать метод Free, вместо прямого вызова деструктора. Уважаемый, вы предлагаете использовать "костыли"(зная о проблеме подстроиться под нее). Ой, смотрите Destroy вызывает исключение, а мы по-хитрому вызовем Free. Вот код из VCL , где никакие "костыли" не помогут: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2019, 12:43 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
High.Programerвы предлагаете использовать "костыли"(зная о проблеме подстроиться под нее). Я предлагаю следовать советам документации. И таки да, писать код зная об особенностях реализации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2019, 12:47 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeyЯ предлагаю следовать советам документации. И таки да, писать код зная об особенностях реализации. уважаемый, а почему авторы VCL (см. их код выше) не придерживаются этих советов? Таки нехорошо... Ась? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2019, 12:49 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
ну и вызывать Destroy вообще говоря неверно нужно Free а лучше FreeAndNil ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2019, 12:52 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
High.Programerа почему авторы VCL (см. их код выше) не придерживаются этих советов? Это вопрос к авторам VCL. Кстати говоря, ни VCL, ни даже RTL, давно уже не являются примером для подражания. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2019, 12:52 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexeyкод в деструкторе не должен приводить к необработанным исключительным ситуациям. Спасибо за ответы по существу. А если случается исключение в деструкторе, то что тогда происходит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2019, 12:53 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2019, 12:55 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
Artem.1stА если случается исключение в деструкторе, то что тогда происходит? Утечки ресурсов, памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2019, 12:56 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexeyни VCL, ни даже RTL, давно уже не являются примером для подражания. По правде говоря, я в соседней теме поднимал вопрос, про что в Delphi является "примером для подражания" :) Если VCL и RTL не эталоны подражания, то чтож тогда... :-( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2019, 12:58 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
destructor TCheckListBox.Destroy; var I: Integer; begin // ... если было Исключение, то FWrapperList не инициализирован for I := 0 to FWrapperList.Count - 1 do TCheckListBoxDataWrapper(FWrapperList[I]).Free; end; Вероятность исключения при TList.Create равна (или очень близка) нулю (не смотрел, что ещё там есть ниже). Если такое произойдёт, значит в программе есть утечка и работать она всё равно уже не будет. Но лучше в деструкторе сначала выполнить проверку if Assigned(FWrapperList) then... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2019, 13:08 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
Artem.1stЕсли VCL и RTL не эталоны подражания, то чтож тогда... Стоит, пожалуй, уточнить. В общем и целом, их код можно рассматривать, как некоторую базовую основу для получения знаний. Но нужно понимать, что код пишется людьми, а людям свойственно ошибаться (приведённый выше пример из VCL - это банальная ошибка, которая не стоит потраченных на её обсуждение усилий). Откровено плохой код, такой, чтоб прям ужас-ужас, там попадается нечасто. Поэтому, рассматривать VCL/RTL, как базу знаний можно, но слепо и бездумно следовать всему, что там написано, всё же, не стоит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2019, 13:20 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
всегда на автопилоте делаю if Assigned(xxx) then FreeAndNil(xxx). пока не подводило ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2019, 13:21 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
DmSerНо лучше в деструкторе сначала выполнить проверку if Assigned(FWrapperList) then... Нет. Гораздо лучше тебе посмотреть в чём отличие .Free от .Destroy ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2019, 13:22 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
Valery_BDmSerНо лучше в деструкторе сначала выполнить проверку if Assigned(FWrapperList) then... Нет. Гораздо лучше тебе посмотреть в чём отличие .Free от .Destroy Ты вроде не со студентами общаешься, если что... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2019, 13:32 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
High.ProgramerKazantsev Alexey3. следует вызывать метод Free, вместо прямого вызова деструктора. Уважаемый, вы предлагаете использовать "костыли"(зная о проблеме подстроиться под нее). Ой, смотрите Destroy вызывает исключение, а мы по-хитрому вызовем Free. Вот код из VCL , где никакие "костыли" не помогут: Код: 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. Используйте блоки try except end; или try finally end; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2019, 13:48 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
эндивсегда на автопилоте делаю if Assigned(xxx) then FreeAndNil(xxx). пока не подводило Бесполезная проверка. Выбросите if — ничего не изменится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2019, 13:53 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
есть офдоки. http://docwiki.embarcadero.com/RADStudio/Rio/en/Methods_(Delphi) там на понятном языке написано и про NIL и про Destroy и про Free зачем еще тащить этот вопрос?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2019, 13:57 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
Что должно происходить в конструкторе класса чтобы он упал по ошибке, причем допустимой? Максимум что приходит в голову, только EOutOfMemory и EExternal какие-нибудь.. При проектировании класса вам надо позаботится о том, чтобы в конструкторе не смогли бы быть вызваны не ожидаемые исключения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2019, 17:25 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
X-CiteЧто должно происходить в конструкторе класса чтобы он упал по ошибке, причем допустимой? EInvalidArgumentException, например. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2019, 17:36 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, Это в методах должно быть. В конструкторе такое нельзя допускать и решается ассертами. Т.е. на этапе разработки такие проблемы исключаются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2019, 19:44 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
X-Cite, А в параметризированных конструкторах? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2019, 19:53 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
X-CiteЧто должно происходить в конструкторе класса чтобы он упал по ошибке, причем допустимой? Максимум что приходит в голову, только EOutOfMemory и EExternal какие-нибудь.. При проектировании класса вам надо позаботится о том, чтобы в конструкторе не смогли бы быть вызваны не ожидаемые исключения. авторAnything that can go wrong will go wrong когда прога идёт на миллионы запусков, случаются даже самые странные вещи, и очень часто неправильно написанный конструктор\деструктор маскирует проблему. причём, в 10-ке выглядит это очень странно Код: 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. и по идее так быть не должно, вызов конструктора как метод не должен удалять объект - это очень странно и явная бага исходник на паскале не соответствует ассемблерной вставке Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2019, 20:05 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)вызов конструктора как метод не должен удалять объект Подумай! Как удалить то, чего нет! Вот ты из лего строишь дом. Вдруг пёс налетел и сборку развалил и погрыз. Лего больше нет. И дом не вышел. Осталось осколки веником подмести и отнести на помойку. С песчаными замками тоже. Строишь-строишь, а тут цунами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2019, 22:11 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
krapotkinну и вызывать Destroy вообще говоря неверно нужно Free а лучше FreeAndNilИногда возможна неприятная ситуация. FreeAndNil вначале обnilяет ссылку, а затем вызывает Free (не представляю, зачем так сделали). И если где-то в недрах деструктора использовалась эта ссылка (как глобальная переменная, к примеру), то будет плохо. Понятно, что к такому может привести только говнокод, но такое случается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2019, 22:19 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeyX-Cite, А в параметризированных конструкторах? Assert для этого. Проектировать классы надо так, чтобы конструкторы не падали по ожидаемой ошибке во время выполнения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2019, 22:29 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
X-CiteAssert для этого. Это тоже будет исключением. X-CiteПроектировать классы надо так, чтобы конструкторы не падали по ожидаемой ошибке во время выполнения. Глупости. Как ты сможешь гарантировать, что, например, конструктор TFileStream не грохнется от тысячи и одной причины? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2019, 22:53 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
X-CiteЧто должно происходить в конструкторе класса чтобы он упал по ошибке, причем допустимой? Максимум что приходит в голову, только EOutOfMemory и EExternal какие-нибудь.. Исключения в конструкторах - нормальное явление, хоть и не желательное. Попробуй TFileStream.Create ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2019, 23:20 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2019, 23:27 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
TFileStream как раз таки генерирует исключение связанное с внешним ресурсом, в моей нотации это External Мы же говорим о замкнутой системе классов, проектируемой в рамках библиотеки/фреймворка/прилоежния. При проектировании таких классов, можно легко избежать возбуждения исключений не связанных с памятью, и внешними ресурсами.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2019, 00:39 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
X-Cite, Этак всё к external отнести можно, параметры же извне поступают... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2019, 01:20 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
ziv-2014 Код: pascal 1. 2. 3. 4. Используйте блоки try except end; или try finally end; Уважаемый, это был код из VCL . И вы решили авторам VCL указаывать как надо деструкторы писать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2019, 08:09 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
X-CiteЧто должно происходить в конструкторе класса чтобы он упал по ошибке ... Уважаемый, вы задаете странные вопросы. В конструкторах часто происходит много работы по инициализации объектов, выделение рерурсов/памяти, цепочка вызовов конструкторов агрегированных объектов, вызовы родительских конструкторов ... и т.д. и т.п. А вы привыкли, работать с "пустыми" конструкорами? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2019, 08:21 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
High.Programer, Никто не спорит что там это все происходит.. авторТ.е. на этапе разработки такие проблемы исключаются. Когда что-то уходит в релиз, там уже нечему вызывать исключения.. Теоретически оно может, а практически никогда. А если там развалилось что-то связанное с памятью это уже и так фатал. А если класс нарушает принцип единственной ответственности, ну так это уже проблемы другого уровня. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2019, 09:13 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
X-CiteА если класс нарушает принцип единственной ответственности, ну так это уже проблемы другого уровня. В принципе - да. И если я тебя правильно понял, то raise Exception.Create в конструкторах быть не должно(т.е. предвиденное исключение). TFileStream - это исключение, а не правило. High.ProgramerА вы привыкли, работать с "пустыми" конструкорами? Я да. Так или иначе 99% конструкторов это: 1. Наследник от TForm 2. Наследник от TControl 3. Наследник от TObject. А если в проекте, есть какой-то другой базовый класс, от которого надо наследоваться и в нём вылезает исключение - то это проблема автора базового класса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2019, 09:45 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
Gatorkealon(Ruslan)вызов конструктора как метод не должен удалять объект Подумай! Как удалить то, чего нет! Вот ты из лего строишь дом. Вдруг пёс налетел и сборку развалил и погрыз. Лего больше нет. И дом не вышел. Осталось осколки веником подмести и отнести на помойку. С песчаными замками тоже. Строишь-строишь, а тут цунами.если следовать такой аналогии вот ты дом сразу без фундамента строишь? нет, сначала нужно выделить память под объект, а потом уже вызывать его постройку Не получилось у бригады дом построить и они тебе всё снесли вместе с фундаментом, круто? Вот и тут так же, т.е. если я напрямую вызываю метод объекта я не ожидаю, что он вызовет удаление памяти под него. Кто выделял память тот и должен удалять, ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2019, 09:45 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
Valery_BHigh.ProgramerА вы привыкли, работать с "пустыми" конструкорами? Я да. Так или иначе 99% конструкторов это: 1. Наследник от TForm Уважаемый, Вы напрасно испытываете мое терпение, т.к. у TForm самый "проблемный" конструктуор из всей VCL. А вы думали он "пустой" ? Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ... а внутрь CreateNew(AOwner) даже не заглядывайте, там Вас ждет ужасное разочарование в виде нескончаемых выделений ресурсов операционной системы (в вашем случае MS Windows) Вы все еще мечтаете о "пустых" конструкторах? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2019, 11:45 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
YuRockFreeAndNil вначале обnilяет ссылку, а затем вызывает Free (не представляю, зачем так сделали). И если где-то в недрах деструктора использовалась эта ссылка (как глобальная переменная, к примеру), то будет плохо. Понятно, что к такому может привести только говнокод, но такое случается. Если кто-то в деструкторе объекта использует внешнюю ссылку на экземпляр этого же объекта, то я даже не знаю как такого человека вежливо назвать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2019, 12:03 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
YuRockFreeAndNil вначале обnilяет ссылку, а затем вызывает Free (не представляю, зачем так сделали).И, кстати, сделали это чтобы после вызова FreeAndNil можно было быть на 100% уверенным, что ссылка будет обнулена, даже если в деструкторе объекта возникнет исключение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2019, 12:05 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
High.ProgramerВ конструкторах часто происходит много работы по инициализации объектов, выделение рерурсов/памяти, цепочка вызовов конструкторов агрегированных объектов, вызовы родительских конструкторов ... и т.д. и т.п.а в деструкторах соответственно часто все должно разматываться в обратную сторону и сюрпризом для кого-то могут оказаться деструкторы таки вызывающие исключения и порой именно в продуктиве ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2019, 14:01 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
alekcvpYuRockFreeAndNil вначале обnilяет ссылку, а затем вызывает Free (не представляю, зачем так сделали).И, кстати, сделали это чтобы после вызова FreeAndNil можно было быть на 100% уверенным, что ссылка будет обнулена, даже если в деструкторе объекта возникнет исключение.А, теперь понятно. Но тогда логичнее было назвать функцию NilAndFree. Я как-то из-за такой проблемы долго бился. P.S. Я лишь привел пример случая, когда o.Free; o := nil; гораздо надежнее, чем FreeAndNil. Особенно, когда работаешь с громадной базой кода, зачастую - чужого. Та же дельфя побуждает глобальные переменные типа Form1 юзать. Вот и юзают, даже внутри методов формы. А бывает, и сам не заметишь, как что-то подобное сам замутишь. В моем случае использовалась ссылка (на себя) из объекта-owner'а, через три прослойки заюзанная в деструкторе. Хорошо, конечно, что я в итоге упростил и улучшил этот говнокод. Но не напиши я там FreeAndNil тогда - не потратил бы день и по сейчас не знал бы об этой проблеме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2019, 00:49 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
Однако, парни, надо исходить из того, что в конструкторах, в общем случае, независимо от всех ваших заклинаний, может произойти все, что угодно. И, исходя именно из этой простой мысли, надо отдавать себе отчет, как же имено предохраняться деструкторах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2019, 01:02 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
Vlad FОднако, парни, надо исходить из того, что в конструкторах, в общем случае, независимо от всех ваших заклинаний, может произойти все, что угодно. И, исходя именно из этой простой мысли, надо отдавать себе отчет, как же имено предохраняться деструкторах.Понятно, что надо. И это прямым текстом написано в хелпе (как-то читал). Только ничего сложного в этом нет. Есть Free и есть if Assigned для более сложных редких случаев. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2019, 01:14 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
Vlad Fнадо исходить из того, что в конструкторах, в общем случае, независимо от всех ваших заклинаний, может произойти все, что угоднои в деструкторах, причем чужих ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2019, 09:53 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
YuRock, авторХорошо, конечно, что я в итоге упростил и улучшил этот говнокод. Но не напиши я там FreeAndNil тогда - не потратил бы день и по сейчас не знал бы об этой проблеме. Не понял, при чем здесь FreeAndNil? Ну юзал бы ты Free вместо FreeAndNil стало бы легче? Всё равно бы полез к разрушенной ссылке. Только в случае FreeAndNil тебе сразу по пальцам дали. А в случае Free имел бы вяло-текущий и проявляющийся в одном случае из десяти или ста баг. Который бы искал не день, а неделю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2019, 09:55 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
YuRockэто прямым текстом написано в хелпесобсно для использования в деструкторах и был изобретен free, для ряда прочих случаев можно сразу дестроить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2019, 09:56 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
ну вы фантазёры сначала был изобретён метод free, как раз для деструкторов, что бы если объект не инициализировался в конструкторе при исключении можно было писать код без проверки существования объекта потом поняли, что ссылка на убитый объект - лажа, и писать отдельно код для её обнуления не камильфо, и придумали FreeAndNil ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2019, 10:49 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
makhaonНе понял, при чем здесь FreeAndNil? Ну юзал бы ты Free вместо FreeAndNil стало бы легче? Всё равно бы полез к разрушенной ссылке. Да, стало бы легче, вернее - совсем хорошо. Никакого обращения "к разрушенной ссылке" не было бы. А так - FreeAndNil вначале присвоил ссылке nil, а затем вызвал деструктор, внутри которого происходило обращение к этому объекту по этой ссылке (которая уже nil, а была равна Self). Теперь понятнее стало? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2019, 12:42 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
YuRock, то есть ты в деструкторе как-то умудрился к конкретному экземпляру обратиться, а не к селфу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2019, 16:27 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
makhaonYuRock, то есть ты в деструкторе как-то умудрился к конкретному экземпляру обратиться, а не к селфу?Ну да ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2019, 16:29 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
Суть того, что деструктор вызовется неявно при ошибке в конструкторе, это очевидно... Предположим что неявного вызова деструктора нет. Рассмотрим несколько кейсов. Код: pascal 1. 2. Если в строке 1 будет Exception, то строка 2 никогда не выполнится и ресурсы выделенные в конструкторе до ошибки не освободятся Код: pascal 1. 2. 3. 4. 5. Если в конструкторе будет исключение, то присвоение в переменную А не будет выполнено. Следовательно строка в finally не валидная, т.к. А смотрит в никуда... Следовательно ресурсы выделенные в конструкторе до ошибки не освободятся В связи с этим логично, что раз присвоения в А нет, но как-то надо реализовать освобождение ресурсов и в этом блоке кода адреса экземпляра нет, то деструктор вызывается неявно, т.к. компилятор в принципе знает об этом. Поэтому деструкторы надо писать исходя из того, что в конструкторе на любом этапе может вылететь исключение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2019, 18:09 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
YuRockmakhaonYuRock, то есть ты в деструкторе как-то умудрился к конкретному экземпляру обратиться, а не к селфу?Ну да Ну кто тебе тогда виноват? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2019, 21:34 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
X-Citeдеструктор вызовется неявно при ошибке в конструкторе, это очевидно... Код: pascal 1. 2. 3. 4. 5. Это наглядный пример, как в delphi используются "очевидные" вещи. Когда в конструкторе происходит исключение, то A.Free() - вызывается 2(два) раза, сначала неявно, а затем явно. Це "очевидно" для Delphi ? Ась... ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2019, 16:06 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
High.ProgramerЭто наглядный пример, как в delphi используются "очевидные" вещи. Когда в конструкторе происходит исключение, то A.Free() - вызывается 2(два) раза, сначала неявно, а затем явно. Це "очевидно" для Delphi ? Ась... ?Это очевидо подтверждает утверждение, что сдуру можно и член сломать. Вне зависимости от языка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2019, 17:51 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
High.ProgramerКогда в конструкторе происходит исключение, то A.Free() - вызывается 2(два) раза, сначала неявно, а затем явно. Це "очевидно" для Delphi ? Ась... ? Неверно.. В finally в A будет лежать мусор, а не экземпляр класса.. Присвоение то не выполнится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2019, 18:12 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
ЕМНИП там нормальный nil будет. Ну потому что конструктор всегда выполняется в неявном try-блоке. Потому что Pascal один из немногих языков, что для людей делался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2019, 14:45 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
BeltarЕМНИП там нормальный nil будет.Там будет мусор из стека. В зависимости от расположения звезд, где-то в 60-80% случаев там окажется nil ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2019, 17:02 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
BeltarЕМНИП там нормальный nil будет. Ну потому что конструктор всегда выполняется в неявном try-блоке. Потому что Pascal один из немногих языков, что для людей делался. Есть два очевидных варианта Код: pascal 1. 2. 3. 4. 5. 6. 7. и Код: pascal 1. 2. 3. 4. 5. 6. или я что-то не понимаю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2019, 17:49 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2019, 18:10 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
makhaonYuRockпропущено... Ну да Ну кто тебе тогда виноват? Это не важно, кто виноват. Это был просто пример, когда FreeAndNil опаснее o.Free; o := nil. И, да, естественно, обращение к конкретному экземпляру было не между begin end деструктора, а глубоко в недрах, т.ч. не всё так очевидно было и легко, как кажется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2019, 18:23 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
YuRock, это пример твоего кривого кода. FreeAndNil всего лишь обозначил проблему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2019, 18:31 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
makhaonYuRock, это пример твоего кривого кода. FreeAndNil всего лишь обозначил проблему.Обозначил, да, и это хорошо, я ж не спорю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2019, 18:37 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)roschinspb, внимательно прочитай 21854330 , это доказательство "от противного" спс, ясно... Эх блин это если до сих пор с Create, Destroy, Free, FreeAndNil холивары идут, это ж какой разрыв шаблона будет если задуматься о DisposeOf, [weak] и AUTOREFCOUNT ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2019, 18:41 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
Artem.1stНа форуме встретил эту фразу: “Если в конструкторе произойдет исключение, то неявно вызовется деструктор” Ссыль на тему ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2019, 18:43 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
roschinspb, arc оказался настолько хорош, что от него решили в линуксе отказаться :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2019, 19:01 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
roschinspbkealon(Ruslan)roschinspb, внимательно прочитай 21854330 , это доказательство "от противного" спс, ясно... Эх блин это если до сих пор с Create, Destroy, Free, FreeAndNil холивары идут, это ж какой разрыв шаблона будет если задуматься о DisposeOf, [weak] и AUTOREFCOUNT в этом виноват Borland (не местный модератор, а компания), они не описали чётко стандарт языка, который придумали ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2019, 19:38 |
|
||
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)roschinspbпропущено... спс, ясно... Эх блин это если до сих пор с Create, Destroy, Free, FreeAndNil холивары идут, это ж какой разрыв шаблона будет если задуматься о DisposeOf, [weak] и AUTOREFCOUNT в этом виноват Borland (не местный модератор, а компания), они не описали чётко стандарт языка, который придумали А надо было отлить в граните и поставить в музей? :o) Любое развитие — это отклонение от стандарта. Вообще говоря, во времена борланд развитие было довольно логичным и адекватным, потом начался разброд и шатание. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2019, 10:57 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2039592]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
155ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
| others: | 192ms |
| total: | 452ms |

| 0 / 0 |
