Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Exit из процедуры-функции 
:(
    Опции темы
mspuz
Дата 18.1.2008, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 20.6.2005
Где: Ногинск

Репутация: нет
Всего: нет



Всем привет!
Всегда не задумываясь использовал ф-ию Exit, если мне нужно было покинуть ф-цию в нужный момент. Но тут копался в исходниках одного "старожилы" и обнаружил, что программист шёл на что угодно, но ни когда не использовал Exit. Поспрашивал и услышал, что это действительно не рекомендуется, но почему - сказать не смогли. Действительно ли это так плохо и главное почему?!
PM MAIL   Вверх
ama_kid
Дата 18.1.2008, 16:48 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 15
Всего: 95



например, необходимо следить за корректностью освобождения выделенной памяти, если такая была. Зачастую бездумный вызов exit может приводить к утечкам памяти, а обдуманный - к избыточности кода. Но по большому счету - имхо это вопрос привычки, из разряда религиозных войн...


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
mspuz
Дата 18.1.2008, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 20.6.2005
Где: Ногинск

Репутация: нет
Всего: нет



ama_kid,  А "естественный" выход из ф-ции (достигнув конца end) отслеживает утечку памяти? По моему нет. Так что следить надо всегда и exit тут ни при чем.
PM MAIL   Вверх
ama_kid
Дата 18.1.2008, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 15
Всего: 95



Цитата(mspuz @  18.1.2008,  17:03 Найти цитируемый пост)
А "естественный" выход из ф-ции (достигнув конца end) отслеживает утечку памяти? По моему нет. Так что следить надо всегда и exit тут ни при чем. 
Следить-то надо всегда, но ляпнув exit не подумав - ты получишь утечку, подумав и ляпнув exit совместно с операторами освобождения памяти - получишь избыточный (дублирующийся) код, о чем я и сказал в предыдущем посте...



--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Shaggy
Дата 19.1.2008, 15:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 2.5.2007
Где: г.Ижевск

Репутация: 3
Всего: 5



Цитата(ama_kid @  18.1.2008,  19:13 Найти цитируемый пост)
подумав и ляпнув exit совместно с операторами освобождения памяти - получишь избыточный (дублирующийся) код, о чем я и сказал в предыдущем посте...

Код

With TStringList.Create Do
  Try
    Add('123');
    Exit;
    Add('321');
  Finally
    Free;
  End;

ничего не дублируется и всё корректно освобождается...
PM MAIL ICQ   Вверх
Coderr
Дата 19.1.2008, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 27.1.2006
Где: Vesnet

Репутация: 0
Всего: 0



Чего-то я сомневаюсь о правильности кода и смысла его вообще.
Строка
Код

Add('321');

не выполнится никогда. А для создания TStringList надо заводить переменную и уже ей присваивать:
Код

var
  temp: TStringList;
...
temp := TStringList.Create;


Это сообщение отредактировал(а) Coderr - 19.1.2008, 18:07
--------------------
Кодинг - это стиль жизни!   
PM WWW ICQ   Вверх
THandle
Дата 19.1.2008, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 65
Всего: 372



Цитата(Coderr @  19.1.2008,  18:05 Найти цитируемый пост)
не выполнится никогда. А для создания TStringList надо заводить переменную и уже ей присваивать:

Необязательно. Можно и как Shaggy написал. 
PM   Вверх
Alexeis
Дата 19.1.2008, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(ama_kid @  18.1.2008,  16:13 Найти цитируемый пост)
Следить-то надо всегда, но ляпнув exit не подумав - ты получишь утечку, подумав и ляпнув exit совместно с операторами освобождения памяти - получишь избыточный (дублирующийся) код, о чем я и сказал в предыдущем посте...


  Более красиво решать при помощи защищенных секций. Для досрочного завершения, генерим исключение и все ресурсы корректно освобождаются  smile .


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
MetalFan
Дата 19.1.2008, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(Alexeis @  19.1.2008,  18:23 Найти цитируемый пост)
решать при помощи защищенных секций

что это такое?   smile я что-то про такое не слышал...
по поводу сабжа - пользую exit (в сочетании с try..finally) в разумных ситуациях без оглядки) и считаю это нормальным подходом)


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Alexeis
Дата 19.1.2008, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(MetalFan @  19.1.2008,  18:27 Найти цитируемый пост)
(в сочетании с try..finally) 

  Это как раз про них.

Добавлено через 3 минуты и 26 секунд
Их еще защищенными блоками зовут иногда.

Добавлено через 6 минут и 19 секунд
  Проблема exit в разрушении логики. При досрочном выходе нужно помнить чего где и когда создал или мог не создать или создал после того как писал фрагмент с exit. Функцию дополнил созданием объекта, а при выходе по exit забыл добавить удаление, вот и утечка.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
MetalFan
Дата 19.1.2008, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(Alexeis @  19.1.2008,  19:43 Найти цитируемый пост)
 Проблема exit в разрушении логики. При досрочном выходе нужно помнить чего где и когда создал или мог не создать или создал после того как писал фрагмент с exit. Функцию дополнил созданием объекта, а при выходе по exit забыл добавить удаление, вот и утечка.

пишу обычно так:
Код

lSomeObject := TSomeObjectClass.Create;
try
  ...{работа с объектом lSomeObject}
  if SomeConition then exit;
  ...
  if SomeConition2 then exit;
  ...
  ...
  if SomeConitionN then exit;
  ...
finally
  lSomeObject.Free;
end;

очень так вполне удобно


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Alexeis
Дата 19.1.2008, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



  Тоже вариант.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Rennigth
Дата 20.1.2008, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



хе! незнал что при exit блок finally все равно выполняется  smile. Вообще exit не очень лублю... антипатия какая-то к нему   smile 


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
MetalFan
Дата 20.1.2008, 15:25 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



все допустимо в разумных пределах...
имхо лучше уж exit, чем  goto)


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0621 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.