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