|
|
|
Если в конструкторе произойдет исключение, то вызывается деструктор?
|
|||
|---|---|---|---|
|
#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 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39797057&tid=2039592]: |
0ms |
get settings: |
8ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
226ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
34ms |
get tp. blocked users: |
1ms |
| others: | 233ms |
| total: | 522ms |

| 0 / 0 |
