Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.08.19;
Скачать: [xml.tar.bz2];

Вниз

try...finally и рекурсия   Найти похожие ветки 

 
Sdubaruhnul   (2007-07-19 22:37) [0]

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


 
Loginov Dmitry ©   (2007-07-19 22:42) [1]

А проверить слабо?

try..finally записывает определенную информацию в стэк, а стэк ведь не резиновый!


 
oxffff ©   (2007-07-19 22:45) [2]

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


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

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

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

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


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

> Sdubaruhnul   (19.07.07 22:37)

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


 
TUser ©   (2007-07-19 22:48) [5]

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


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

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

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


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

> Sdubaruhnul   (19.07.07 22:51) [6]

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

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

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

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


 
Sdubaruhnul   (2007-07-19 23:07) [8]

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

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


 
Loginov Dmitry ©   (2007-07-20 07:52) [9]

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


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


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

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

Почему?


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


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

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


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

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


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


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

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


 
oxffff ©   (2007-07-20 10:50) [13]


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


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


 
Loginov Dmitry ©   (2007-07-20 11:50) [14]

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


 
Loginov Dmitry ©   (2007-07-20 11:50) [15]

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


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

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

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


 
MsGuns ©   (2007-07-20 12:09) [17]

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


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


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


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


 
MsGuns ©   (2007-07-20 12:16) [19]

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

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


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

MsGuns ©   (20.07.07 12:16) [19]

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


 
oxffff ©   (2007-07-20 12:31) [21]


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


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



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.08.19;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.045 c
15-1184687428
Ricks
2007-07-17 19:50
2007.08.19
Обман программы


1-1181524266
Yus
2007-06-11 05:11
2007.08.19
Помогите с RichEdit


15-1185115628
Rubagl
2007-07-22 18:47
2007.08.19
Книга "Delphi. Готовые алгоритмы. " Нужны исходники.


6-1168162326
_darksidenv
2007-01-07 12:32
2007.08.19
Winsock API и accept


5-1160276416
atruhin
2006-10-08 07:00
2007.08.19
Как создать глобальный компонент? Т.е. находящийся в одном экземп





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский