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

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

Про DynArray и исключения [D7]


Alex_KV ©   (2006-09-01 10:26:00) 

Здравствуйте!
Вот такой вопрос интересует.
При работе Delphi хитро работает с дин. масивами и строками.
Разобраться помогла статья на RSDN.
Но некоторые вопросы остались. Например, если в процедуре объявлена
лок. переменная типа дин.массив. Для нее Delphi генерит доп. код инициализации при входе в процедуру и код финализации из массива.
Соответственно, я в процедуре смело работаю с этой переменной и при выходе из процедуры голова не болит - память, отвед. под дин. массив, должна будет освобожена.
А вот если в процедуре возникнет исключение? Освобоиться ли память?
Нужно ли при работе заключать код в try-блоки, чтоб железно память освободилась?


Плохиш   (2006-09-01 15:28:00) [1]


> >  a[0] := 1 / 0;

А эта запись, кстати, может и не вызвать исключения ;-) NAN


Сергей М.   (2006-09-01 15:16:00) [2]


>  a[0] := 1 / 0;


К чему такие сложности ?)

Для "полевых испытаний" по сабжу (и не только) вполне подходит классическое
raise Exception.Create('');


Ketmar   (2006-09-01 15:13:00) [3]

> [3] jack128 ©   (01.09.06 11:05)
ну, это вопрос вкуса, конечно. я зачастую даже строки освобождаю. %-)


Джо   (2006-09-01 13:45:00) [4]


> DynArrayClear вызывается и с исключением и без (с/без второй
> строки).

Дык, а чем не устроил ответ jack128 ©   (01.09.06 11:05) [3]?  Хотя, конечно, самому проверить оно надежнее :)


Alex_KV   (2006-09-01 13:39:00) [5]

To Ega23
Да, просмотр CPU внес некоторые объяснения
Составил процедурку
procedure X;
var a : array of Double;
begin
 SetLength(a, 1);
 a[0] := 1 / 0;
end;CODE>
DynArrayClear вызывается и с исключением и без (с/без второй строки).
Наверно на этом вопрос закрыт.


Джо   (2006-09-01 13:26:00) [6]


> Barloggg   (01.09.06 13:22) [7]
>
> ну, почему же. когда у меня сами по себе висят несколько
> глобальных объектов отдельно от главной формы и их убивание
> стоит в деструкторе это самой формы да еще и с условиями,
>  то почему бы и не проверить на всякий случай их еще и в
> секции finalize.

Где в топике спрашивается о глобальных (и каких-либо вообще) "объектах"? Где там спрашивается также о "формах"?


Barloggg   (2006-09-01 13:22:00) [7]

ну, почему же. когда у меня сами по себе висят несколько глобальных объектов отдельно от главной формы и их убивание стоит в деструкторе это самой формы да еще и с условиями, то почему бы и не проверить на всякий случай их еще и в секции finalize.


Джо   (2006-09-01 12:42:00) [8]


> Barloggg   (01.09.06 12:36) [4]
>
> А еще есть секция finalize,

... и никакого отношения к сабжу она не имеет. Если уж на то пошло, то к сабжу имеет некоторое отношение процедураFinalize.


Плохиш   (2006-09-01 12:39:00) [9]


> Barloggg   (01.09.06 12:36) [4]
> А еще есть секция finalize,

Давай мух и котлеты в одну кучу валить не будем.


Barloggg   (2006-09-01 12:36:00) [10]

А еще есть секция finalize, только мне пока недосуг было проверить выполняется ли она при вылете или нет.


jack128   (2006-09-01 11:05:00) [11]

Ketmar ©   (01.09.06 10:30) [2]
вообще-то рекомендовано всё ресурсы освобождать руками (кроме строк, потому что это уже маразм %-) -- для вящей понятности.

ну теже Variant'ы , дин массивы - это такой же маразм, как и строки ;-)
Alex_KV   (01.09.06 10:26)
Освобоиться ли память?

да.  Дельфя неявно ставит блок try-finally-end для всех long strings/dynamic arrays/Variants/interfaces .
Единственный момент, когда тут может быть мемлик, это использование ExitThread/TerminateThread и тому подобных функций..


Ega23   (2006-09-01 10:30:00) [12]


> А вот если в процедуре возникнет исключение? Освобоиться
> ли память?


А ты проверь. Через F12 посмотри, какие вызовы будут идти.


Ketmar   (2006-09-01 10:30:00) [13]

> [0] Alex_KV   (01.09.06 10:26)
вообще-то рекомендовано всё ресурсы освобождать руками (кроме строк, потому что это уже маразм %-) -- для вящей понятности.


Наверх

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