Форум: "Начинающим";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];
ВнизПро DynArray и исключения Найти похожие ветки
← →
Alex_KV (2006-09-01 10:26) [0]Здравствуйте!
Вот такой вопрос интересует.
При работе Delphi хитро работает с дин. масивами и строками.
Разобраться помогла статья на RSDN.
Но некоторые вопросы остались. Например, если в процедуре объявлена
лок. переменная типа дин.массив. Для нее Delphi генерит доп. код инициализации при входе в процедуру и код финализации из массива.
Соответственно, я в процедуре смело работаю с этой переменной и при выходе из процедуры голова не болит - память, отвед. под дин. массив, должна будет освобожена.
А вот если в процедуре возникнет исключение? Освобоиться ли память?
Нужно ли при работе заключать код в try-блоки, чтоб железно память освободилась?
← →
Ega23 © (2006-09-01 10:30) [1]
> А вот если в процедуре возникнет исключение? Освобоиться
> ли память?
А ты проверь. Через F12 посмотри, какие вызовы будут идти.
← →
Ketmar © (2006-09-01 10:30) [2]> [0] Alex_KV (01.09.06 10:26)
вообще-то рекомендовано всё ресурсы освобождать руками (кроме строк, потому что это уже маразм %-) -- для вящей понятности.
← →
jack128 © (2006-09-01 11:05) [3]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 и тому подобных функций..
← →
Barloggg (2006-09-01 12:36) [4]А еще есть секция finalize, только мне пока недосуг было проверить выполняется ли она при вылете или нет.
← →
Плохиш © (2006-09-01 12:39) [5]
> Barloggg (01.09.06 12:36) [4]
> А еще есть секция finalize,
Давай мух и котлеты в одну кучу валить не будем.
← →
Джо © (2006-09-01 12:42) [6]
> Barloggg (01.09.06 12:36) [4]
>
> А еще есть секция finalize,
... и никакого отношения к сабжу она не имеет. Если уж на то пошло, то к сабжу имеет некоторое отношение процедура Finalize.
← →
Barloggg (2006-09-01 13:22) [7]ну, почему же. когда у меня сами по себе висят несколько глобальных объектов отдельно от главной формы и их убивание стоит в деструкторе это самой формы да еще и с условиями, то почему бы и не проверить на всякий случай их еще и в секции finalize.
← →
Джо © (2006-09-01 13:26) [8]
> Barloggg (01.09.06 13:22) [7]
>
> ну, почему же. когда у меня сами по себе висят несколько
> глобальных объектов отдельно от главной формы и их убивание
> стоит в деструкторе это самой формы да еще и с условиями,
> то почему бы и не проверить на всякий случай их еще и в
> секции finalize.
Где в топике спрашивается о глобальных (и каких-либо вообще) "объектах"? Где там спрашивается также о "формах"?
← →
Alex_KV (2006-09-01 13:39) [9]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:45) [10]
> DynArrayClear вызывается и с исключением и без (с/без второй
> строки).
Дык, а чем не устроил ответ jack128 © (01.09.06 11:05) [3]? Хотя, конечно, самому проверить оно надежнее :)
← →
Ketmar © (2006-09-01 15:13) [11]> [3] jack128 © (01.09.06 11:05)
ну, это вопрос вкуса, конечно. я зачастую даже строки освобождаю. %-)
← →
Сергей М. © (2006-09-01 15:16) [12]
> a[0] := 1 / 0;
К чему такие сложности ?)
Для "полевых испытаний" по сабжу (и не только) вполне подходит классическое
raise Exception.Create("");
← →
Плохиш © (2006-09-01 15:28) [13]
> > a[0] := 1 / 0;
А эта запись, кстати, может и не вызвать исключения ;-) NAN
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.04 c