Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Динамические массивы


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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо