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

start [/forum/topic.php?fid=58&msg=39795763&tid=2039592]: |
0ms |
get settings: |
9ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
167ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
74ms |
get tp. blocked users: |
2ms |
| others: | 208ms |
| total: | 502ms |

| 0 / 0 |
