Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

try...finally и рекурсия [D7, XP]


Страницы:   1 2

Sdubaruhnul ©   (2007-07-19 22:37:00) 

Собираюсь тут пустить рекурсию и хотелось бы защитить удаление хендла при помощи try..finally. Но вот слышал когда-то, что есть у try..finally максимальный уровень вложенности. М-м... Это так или бред?


oxffff   (2007-07-20 12:31:00) [1]


> Loginov Dmitry ©   (20.07.07 11:50) [14]
> я имел ввиду только локальные параметры.


в таком случае придется выкручиваться с указателями.
Чтобы не было авто финализации. :)
А так я с тобой полностью согласен. Ценное дополнение.


Игорь Шевченко   (2007-07-20 12:29:00) [2]

MsGuns ©   (20.07.07 12:16) [19]

Handle вроде ни на что не указывает. Handle - это индекс в таблице.


MsGuns   (2007-07-20 12:16:00) [3]

>Игорь Шевченко ©   (20.07.07 12:13) [18]
>CloseHandle - поверь, он удалится...

А что будет с той хреновиной, на которую он, собственно, указывает ?


Игорь Шевченко   (2007-07-20 12:13:00) [4]


> А мне вот интересно, как можно УДАЛИТЬ хэндл ?


CloseHandle - поверь, он удалится...


MsGuns   (2007-07-20 12:09:00) [5]

А мне вот интересно, как можно УДАЛИТЬ хэндл ?


Игорь Шевченко   (2007-07-20 11:55:00) [6]

Loginov Dmitry ©   (20.07.07 11:50) [14]

А ты пробуй прежде чем советовать. Оно рулез


Loginov Dmitry   (2007-07-20 11:50:00) [7]

параметры -> переменные :)


Loginov Dmitry   (2007-07-20 11:50:00) [8]

я имел ввиду только локальные параметры.


oxffff   (2007-07-20 10:50:00) [9]


> Loginov Dmitry ©   (20.07.07 07:52) [9]
> > Запускать всю рекурсию в одном try-finally.
>
>
> +
> И при этом не использовать в рекурсивной процедуре строки,
>  динамические массивы, варианты и интерфейсы.


А если объявить входные параметры как const,var, out?
Либо использовать указатели?


Игорь Шевченко   (2007-07-20 10:32:00) [10]

Loginov Dmitry ©   (20.07.07 07:52) [9]


> +
> И при этом не использовать в рекурсивной процедуре строки,
>  динамические массивы, варианты и интерфейсы.


Я об этом не знал и пользовался в рекурсивной процедуре строками...
И try...finally тоже...
И handle делал свой на каждом уровне рекурсии...

Пойду выброшу программу


Однокамушкин   (2007-07-20 08:07:00) [11]


> Юрий Зотов ©   (20.07.07 08:02) [10]
> Почему?

Видимо, потому, что при наличии таких переменных создаётся неявная секция try..finally, чтобы при любом завершении функции гарантированно финализировать их...


Юрий Зотов   (2007-07-20 08:02:00) [12]

> Loginov Dmitry ©   (20.07.07 07:52) [9]

Почему?


Loginov Dmitry   (2007-07-20 07:52:00) [13]

> Запускать всю рекурсию в одном try-finally.


+
И при этом не использовать в рекурсивной процедуре строки, динамические массивы, варианты и интерфейсы.


Sdubaruhnul   (2007-07-19 23:07:00) [14]

> Юрий Зотов ©   (19.07.07 23:02) [7]

Спасибо за советы. У меня как раз первое. Буду пробовать.


Юрий Зотов   (2007-07-19 23:02:00) [15]

> Sdubaruhnul   (19.07.07 22:51) [6]

То есть, каждой итерации нужен именно свой СОБСТВЕННЫЙ хэндл? Или одним на всех можно обойтись?

Если первое, то можно:

1. Попробовать все же обычный код (с try-finally в каждой итерации). Стек хоть и не резиновый, но и не маленький, его вполне может и хватить. К тому же, его можно и увеличить.

2. Запускать всю рекурсию в одном try-finally. Каждая итерация, получив хэндл, добавляет его в какой-то глобальный список, а по завершении освобождает хэндл и убирает его из списка. После завершения всей рекурсии (по любой причине) в общей секции finally освобождаются хэндлы, еще оставшиеся в списке.


Sdubaruhnul   (2007-07-19 22:51:00) [16]

> Лучше всего построить код так, чтобы рекурсия запускалась из секции try, а сам блок try-finally оставался нерекурсивным.

В каждой рекурсивной итерации мне нужно создавать хендл, который хотелось бы гарантированно освободить. Как же иначе поступить?


TUser   (2007-07-19 22:48:00) [17]

Рекусрия тоже через стек, а он не резиновый :)


Юрий Зотов   (2007-07-19 22:46:00) [18]

> Sdubaruhnul   (19.07.07 22:37)

Лучше всего построить код так, чтобы рекурсия запускалась из секции try, а сам блок try-finally оставался нерекурсивным.


Sdubaruhnul   (2007-07-19 22:46:00) [19]

Ясно, спасибо.

> а стэк ведь не резиновый!

But in Win32 stack is cheap. (c) Danny Thorpe


oxffff   (2007-07-19 22:45:00) [20]

Максимальный уровень ограничен размером стека


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо