![]() |
|
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]()
|
|
| Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: нет Всего: 18 |
Это стандартный шаблон кода, входящий в состав среды Delphi 2006, который можно выбрать нажатием плавишь Ctrl + J. Почему объект создаётся перед блоком try, а не внутри него? |
|||
|
||||
| Beltar |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 627 Регистрация: 11.1.2006 Репутация: 0 Всего: 7 |
Помнится на DelphiKingdom в разделе "Свитки" были статейки на тему безопасности языков программирования, где как раз и обсуждались обломы в конструкторе и многое другое.
Статьи назывались: "ЯП, ОПП и т.д. и т.п. в свете безопасности программирования" http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=301 всего 4 части и ответ на нее "Игра отражений" http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=346. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере. |
|||
|
||||
| pseud |
|
|||
![]() Экспёрт Тыдыщ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1175 Регистрация: 18.5.2007 Где: Минск, Беларусь Репутация: 10 Всего: 40 |
потому что
может отработать с ошибками и в MyClass у тебя останется nil. И в итоге ты обратишься в MyClass.Free к методу несуществующего объекта и получишь AV -------------------- Испытание чужого терпения можно считать успешным, если оно лопнуло... |
|||
|
||||
| Beltar |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 627 Регистрация: 11.1.2006 Репутация: 0 Всего: 7 |
Причем здесь это? Все равно Free будет вызвано, и если Create не отработал, то ты получишь AV. А конструктор в try запихивать не надо, потому что он по умолчанию в защищенном блоке работает. Так что шаблон вполне логичный. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере. |
|||
|
||||
| pseud |
|
||||||
![]() Экспёрт Тыдыщ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1175 Регистрация: 18.5.2007 Где: Минск, Беларусь Репутация: 10 Всего: 40 |
именно так я и написал....
интересно в каком защищенном блоке работает constructor в примере?
-------------------- Испытание чужого терпения можно считать успешным, если оно лопнуло... |
||||||
|
|||||||
| Beltar |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 627 Регистрация: 11.1.2006 Репутация: 0 Всего: 7 |
Ссылки выше. "Игра отражений" Не забываем, что Create это не только и не столько конструктор, написанный разработчиком класса.
Присваивание же переменной nil это самое логичное поведение при сбое, которое легко проверить без try. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере. |
|||
|
||||
| Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: нет Всего: 18 |
Так, что ли?
А зачем тогда try finally? Если у кого то есть рабочий пример использования, пожалуйста приведите с пояснениями. |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
не так. смысл в том, что код в секции finally выполняется при любом раскладе в секции try. чаще всего она используется для своевременного освобождения захваченных ресурсов. Rohoss, проверка во 2й строке не имеет смысла, ибо в случае исключения в конструкторе мы на нее не попадем, соотв. если исключение не возникнет, то и условие не выполнится. Пример:
-------------------- There are always someone smarter than you... |
|||
|
||||
| Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: нет Всего: 18 |
Так почему мы попадём в секцию finaly, если исключение возникнет при выделении памяти, до блока try?
Это сообщение отредактировал(а) Rohoss - 22.6.2008, 10:35 |
|||
|
||||
| Rrader |
|
|||
|
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 18 Всего: 191 |
А мы туда не попадем. Если исключение (reOutOfMemory) сгенерится в GetMem, память просто не будет выделена, а NIL и освобождать не нужно. Но мы и не дойдем до try-finally-end. Тут речь о том, что блок try-finally-end позволяет гарантированно освобождать валидные ресурсы.
Вот, final-версия этого поста Это сообщение отредактировал(а) Rrader - 22.6.2008, 11:02 |
|||
|
||||
| Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: нет Всего: 18 |
Так этот блок не обрабатывает исключений в конструкторе объекта?
Я имею ввиду то, что в конструкторе, помимо выделения памяти может много ещё чего содержатся. А если всё же память будет равна nil, мы перейдём в блок try, с него естественно в finaly, а там MyClass.Free , обращение к методу несуществующего класса… Сори за такие вопросы, просто хочу понять, как это работает… Это сообщение отредактировал(а) Rohoss - 22.6.2008, 10:52 |
|||
|
||||
| Rrader |
|
|||
|
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 18 Всего: 191 |
1. Обо всех опасных действиях в конструкторе нужно заботиться самостоятельно и защищать их теми же try-finally-end.
2. Возникает исключение в конструкторе. Если все находится в правильно оформленном защищенном SEH-блоке(try-finally-end), то ресурсы гарантированно освободятся. Что происходит потом? А ничего, выход. Смотри:
Так вот здесь мы не дойдем до Seek никогда. Понятно теперь? |
|||
|
||||
| Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: нет Всего: 18 |
Rrader , тебе не надоело редактировать своё сообщение, пиши нове, а то хз что получается.
|
|||
|
||||
| Rrader |
|
|||
|
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 18 Всего: 191 |
Rohoss, это чтоб понятнее было исправлял =)
Вот тебе еще пример:
До FreeMem дело не дойдет, даже до try не дойдет, если будет ошибка Out Of Memory. Это сообщение отредактировал(а) Rrader - 22.6.2008, 10:59 |
|||
|
||||
| Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: нет Всего: 18 |
Угу, ну тогда всё логично. Просто я почему то думал что этот блок защищает и от ошибок конструктора…
|
|||
|
||||
| MetalFan |
|
||||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
и ничего страшного не произойдет (конечно после конструктора переменная класса всегда <> nil, кроме случаев возникновения исключения в конструкторе). Free тем от Destroy и отличается, что проверяет Self<>nil. так что конструкции типа
смысла не имеют никакого. Это сообщение отредактировал(а) MetalFan - 22.6.2008, 11:09 -------------------- There are always someone smarter than you... |
||||
|
|||||
![]()
|
| Правила форума "Delphi: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |