Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Finalize array of array of Integer / 12 сообщений из 12, страница 1 из 1
02.10.2018, 16:38
    #39711825
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Finalize array of array of Integer
Синтетический пример, по которому есть вопрос:

Код: 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
02.10.2018, 16:45
    #39711836
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Finalize array of array of Integer
Квейд,

Будет финализироваться весь массив. Но здесь финализация не нужна. Все финализируется само. Явная финализация нужна при работе с указателями на типы с управляемым временем жизни. Тут этого нет
...
Рейтинг: 0 / 0
02.10.2018, 16:55
    #39711844
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Finalize array of array of Integer
_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
02.10.2018, 17:14
    #39711854
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Finalize array of array of Integer
Квейдбудет существовать и иметь свой экземпляр для каждого звена во всей цепочке рекурсииНе факт. Оптимизатор может грохнуть переменную как только увидит, что она нигде не используется.

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

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

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


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

Зайди в процедуру под отладчиком, открой CPU Window (Ctrl+Alt+C) и увидишь вызов .. что-то там типа DynArrayClear. Это должно дать ответы на все вопросы.
...
Рейтинг: 0 / 0
08.10.2018, 17:21
    #39714585
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Finalize array of array of Integer
_Vasilisk_Квейдуправляемые типы вроде массивов грохаются, когда выходят за пределы области видимостиЭто гарантировано. Но оптимизатор может их прибить когда они больше не нужны. А может и не прибить
Оптимизатор не настолько умный. Видя переменные managed типа, он тупо оборачивает весь код в блок try-finally, где в finally секции очищает все переменные.
...
Рейтинг: 0 / 0
10.10.2018, 02:09
    #39715285
AX-Class
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Finalize array of array of Integer
При выходе из зоны видимости все очистится. Но надо понимать ситуации, когда зона видимости не работает.
Код: 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
10.10.2018, 08:40
    #39715354
jmp_original
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Finalize array of array of Integer
AX-Class, зона видимости тут совершенно ни при чём. О чём чётко написано в хэлпе.
...
Рейтинг: 0 / 0
10.10.2018, 11:06
    #39715436
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Finalize array of array of Integer
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
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Finalize array of array of Integer / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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