![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
try...finally и рекурсия [D7, XP]
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]Максимальный уровень ограничен размером стека