![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамические массивы
Misha © (2002-12-05 11:01:00)Как правильно освободить память, выделенную под динамический массив при помощипроцедуры SetLength.
var
a:array of array of integer;
begin
SetLength(a,10,5);
end;
Будет ли она освоюождена полностью, если я выполню
a:=nil;
И ещё такой вопрос в
var
a:array[100] of integer;
pa:=^a;
i,n:integer;
begin
n:=10;
GetMem(pa,n*sizeof(integer));
For i:=1 to n do pa^[i]:=0;
end;
Проведя пошаговое тестирование программы, я обнаружил, что
указатель ссылается на массив из 100 элементов, а не из 10,
почему так?
Дельфятник (2002-12-05 16:04:00) [1]А у меня есть такой вопрос. Бывают ли утечки памяти прри работе с динамическим массивом?
То есть, если в процедуре есть локальная переменная a: array of Integer и в этой процедуре этот массив заполняется чем-то, то нужно ли в конце писать a:=nil или нет?
Anatoly Podgoretsky (2002-12-05 15:41:00) [2]Pa указатель на Ta, который соответствующего размера, так что все правильно
perov (2002-12-05 14:44:00) [3]А в какой версии Делфи можно так описывать массивы
array[100] of integer ?
Нижняя граница чему равна? 0 или 1?
Misha (2002-12-05 14:03:00) [4]Прошу прощения, за свои опечатки, мой пример выглядит так
Type
Ta:array[100] of integer;
PTa:^Ta;
var
i,n:integer;
pa:PTa;
begin
n:=10;
GetMem(pa,n*sizeof(integer));
For i:=1 to n do pa^[i]:=0;
end;
Anatoly Podgoretsky (2002-12-05 12:23:00) [5]Да нет у него объявлен статический массив
var
a:array[100] of integer;
Вот здесь этот массив присваивается указателю
pa:=^a;
А вот здесь этот указатель сразу заменяется на динамически выделенну. область
GetMem(pa,n*sizeof(integer));
Если же нужен действительно динамический массив, то его надо и использовать, а не мамостоятельно выделять память и отслеживать это в дальнейшем
a:array of integer;
PA совсеи не нужен
LongIsland (2002-12-05 11:58:00) [6]А мне показалось, что он все-таки сослался на область из 100 integer"ов. Тогда
GetMem(pa,n*sizeof(integer));, если n = 10 смысла не имеет.
Что не так?
Внук (2002-12-05 11:54:00) [7]Anatoly Podgoretsky © (05.12.02 11:46)
Действительно, ерунда. Я прочитал это как
type
a:array[100] of integer;
var
pa:=^a;
i,n:integer;
begin
...
Тогда есть смысл...
Anatoly Podgoretsky (2002-12-05 11:46:00) [8]Там вообще не понятно, сначала присваивается статический масси, а потом сразу де зачем то заменяется на динамически выделенную память, имитирующию этот массив.
А верно или неверно делает коипилятор определить нельзя, так как как не приведено описание PA
Внук (2002-12-05 11:36:00) [9]Не видел. Я читал в бумаге, сейчас в Internet-магазинах продается.
LongIsland (2002-12-05 11:29:00) [10]
> Внук © (05.12.02 11:25)
> книги Рода Стивенса "Delphi. Готовые алгоритмы", глава вторая
Давно хотел спросить, ее в електронном виде нету?
Внук (2002-12-05 11:25:00) [11]>>Проведя пошаговое тестирование программы, я обнаружил, что
указатель ссылается на массив из 100 элементов, а не из 10,
почему так?
Потому что компилятор и отладчик считают, исходя из типа переменной, что там лежит массив из 100 элементов. Память же выделена только для 10, поэтому реально только с ними и можно работать, остальное - на свой страх и риск.
Приведенный пример один в один похож на примеры из книги Рода Стивенса "Delphi. Готовые алгоритмы", глава вторая. Там все подробно описано с большим количеством других полезных фрагментов кода :)
FreeLancer (2002-12-05 11:10:00) [12]А для зануления массива:
SetLength(MyArray, 0);
Skier (2002-12-05 11:09:00) [13]>Misha
> Будет ли она освоюождена полностью, если я выполню
> a:=nil;
Будет...
To deallocate a dynamic array, assign nil to a variable that references the array or pass the variable to Finalize;
FreeLancer (2002-12-05 11:08:00) [14]Пример из Delphi Help:
var
F: file;
Size: Integer;
Buffer: PChar;
begin
AssignFile(F, "test.txt");
Reset(F, 1);
try
Size := FileSize(F);
GetMem(Buffer, Size);
try
BlockRead(F, Buffer^, Size);
ProcessFile(Buffer, Size);
finally
FreeMem(Buffer);
end;
finally
CloseFile(F);
end;
end;