powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Finalize array of array of Integer
12 сообщений из 12, страница 1 из 1
Finalize array of array of Integer
    #39711825
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Синтетический пример, по которому есть вопрос:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
procedure DoSome;
var
  A: array of array of Integer;
  I: Integer;
begin
// создаем массив, напоминающий гребешок с разной длиной зубцов
  SetLength(A, 3);
  for I := 0 to 2 do
    SetLength(A[I], Random(10));
//...
  Finalize(A); // Вопрос: финализнется ли весь "гребешок" или по каждому "зубу" надо делать отдельный Finalize?
//...
end;



When a movie is over, it's a black
...
Рейтинг: 0 / 0
Finalize array of array of Integer
    #39711836
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд,

Будет финализироваться весь массив. Но здесь финализация не нужна. Все финализируется само. Явная финализация нужна при работе с указателями на типы с управляемым временем жизни. Тут этого нет
...
Рейтинг: 0 / 0
Finalize array of array of Integer
    #39711844
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Квейд,

Будет финализироваться весь массив. Но здесь финализация не нужна. Все финализируется само. Явная финализация нужна при работе с указателями на типы с управляемым временем жизни. Тут этого нет

Дело в том, что по-факту моя процедура рекурсивная, то есть если я не финализирую массив А перед следующим рекурсивным вызовом DoDome, то массив A будет существовать и иметь свой экземпляр для каждого звена во всей цепочке рекурсии, чего я как раз пытаюсь избежать.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
procedure DoSome;
var
  A: array of array of Integer;
  I: Integer;
begin
  SetLength(A, 3);
  for I := 0 to 2 do
    SetLength(A[I], Random(10));
//...
  Finalize(A); если этого не сделать здесь, то массив будет существовать отдельно для каждого рекурсивного вызова, разве нет?
//…
  DoSome;
//…

end;
...
Рейтинг: 0 / 0
Finalize array of array of Integer
    #39711854
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейдбудет существовать и иметь свой экземпляр для каждого звена во всей цепочке рекурсииНе факт. Оптимизатор может грохнуть переменную как только увидит, что она нигде не используется.

Если хочешь все контролировать явно, то, имхо, проще вызвать
Код: pascal
1.
SetLength(A, 0);
...
Рейтинг: 0 / 0
Finalize array of array of Integer
    #39711876
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Квейдбудет существовать и иметь свой экземпляр для каждого звена во всей цепочке рекурсииНе факт. Оптимизатор может грохнуть переменную как только увидит, что она нигде не используется.

Если хочешь все контролировать явно, то, имхо, проще вызвать
Код: pascal
1.
SetLength(A, 0);

По идее, управляемые типы вроде массивов грохаются, когда выходят за пределы области видимости
...
Рейтинг: 0 / 0
Finalize array of array of Integer
    #39711892
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейдуправляемые типы вроде массивов грохаются, когда выходят за пределы области видимостиЭто гарантировано. Но оптимизатор может их прибить когда они больше не нужны. А может и не прибить
...
Рейтинг: 0 / 0
Finalize array of array of Integer
    #39711950
Finalize
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Finalize пройдётся по каждому из выделенных элементов массива, уничтожив все выделенные массивы внутри.


это легко проверить, взяв указатель на выделенный элемент, и после Finalize попытаться обратится по указателю.
...
Рейтинг: 0 / 0
Finalize array of array of Integer
    #39712085
delphinotes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Квейд,

Зайди в процедуру под отладчиком, открой CPU Window (Ctrl+Alt+C) и увидишь вызов .. что-то там типа DynArrayClear. Это должно дать ответы на все вопросы.
...
Рейтинг: 0 / 0
Finalize array of array of Integer
    #39714585
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Квейдуправляемые типы вроде массивов грохаются, когда выходят за пределы области видимостиЭто гарантировано. Но оптимизатор может их прибить когда они больше не нужны. А может и не прибить
Оптимизатор не настолько умный. Видя переменные managed типа, он тупо оборачивает весь код в блок try-finally, где в finally секции очищает все переменные.
...
Рейтинг: 0 / 0
Finalize array of array of Integer
    #39715285
AX-Class
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При выходе из зоны видимости все очистится. Но надо понимать ситуации, когда зона видимости не работает.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
procedure TForm1.Button1Click(Sender: TObject);
type
 TArr = array of array of Integer;
  TRecord = Record
    A: TArr;
  end;
var
  A: TArr;
  I: Integer;
  recPointer : ^TRecord;
begin
  ReportMemoryLeaksOnShutdown := True;
// создаем массив, напоминающий гребешок с разной длиной зубцов
  SetLength(A, 3);
  for I := 0 to 2 do
    SetLength(A[I], Random(10));
  GetMem(recPointer, SizeOf(TRecord));
  recPointer.A := A;
//...
  Finalize(A); // Вопрос: финализнется ли весь "гребешок" или по каждому "зубу" надо делать отдельный Finalize?
  Finalize(recPointer^);  // <-- если убрать, то потечём
  //...
  FreeMem(recPointer);
end;
...
Рейтинг: 0 / 0
Finalize array of array of Integer
    #39715354
jmp_original
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AX-Class, зона видимости тут совершенно ни при чём. О чём чётко написано в хэлпе.
...
Рейтинг: 0 / 0
Finalize array of array of Integer
    #39715436
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AX-Class,

Ну если неправильно работать с памятью, то да, потечёт.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
procedure TForm1.Button1Click(Sender: TObject);
type
 TArr = array of array of Integer;
  TRecord = Record
    A: TArr;
  end;
var
  A: TArr;
  I: Integer;
  recPointer : ^TRecord;
begin
  ReportMemoryLeaksOnShutdown := True;
// создаем массив, напоминающий гребешок с разной длиной зубцов
  SetLength(A, 3);
  for I := 0 to 2 do
    SetLength(A[I], Random(10));
// --- GetMem(recPointer, SizeOf(TRecord));
  New(recPointer);
  recPointer.A := A;
//...
  Finalize(A); // Вопрос: финализнется ли весь "гребешок" или по каждому "зубу" надо делать отдельный Finalize?
// --- Finalize(recPointer^);  // <-- если убрать, то потечём
  //...
// ---  FreeMem(recPointer);
  Dispose(recPointer);
end;


Как бы всегда для типизированных указателей применялось New() и Dispose(). Они и размер сами нужный выделят и Finalize при необходимости сделают.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Finalize array of array of Integer
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]