Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.16;
Скачать: CL | DM;

Вниз

Динамические массивы   Найти похожие ветки 

 
Misha   (2002-12-05 11:01) [0]

Как правильно освободить память, выделенную под динамический массив при помощипроцедуры 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,
почему так?


 
FreeLancer ©   (2002-12-05 11:08) [1]

Пример из 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;


 
Skier ©   (2002-12-05 11:09) [2]

>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:10) [3]

А для зануления массива:
SetLength(MyArray, 0);


 
Внук ©   (2002-12-05 11:25) [4]

>>Проведя пошаговое тестирование программы, я обнаружил, что
указатель ссылается на массив из 100 элементов, а не из 10,
почему так?

Потому что компилятор и отладчик считают, исходя из типа переменной, что там лежит массив из 100 элементов. Память же выделена только для 10, поэтому реально только с ними и можно работать, остальное - на свой страх и риск.

Приведенный пример один в один похож на примеры из книги Рода Стивенса "Delphi. Готовые алгоритмы", глава вторая. Там все подробно описано с большим количеством других полезных фрагментов кода :)


 
LongIsland ©   (2002-12-05 11:29) [5]


> Внук © (05.12.02 11:25)


> книги Рода Стивенса "Delphi. Готовые алгоритмы", глава вторая

Давно хотел спросить, ее в електронном виде нету?


 
Внук ©   (2002-12-05 11:36) [6]

Не видел. Я читал в бумаге, сейчас в Internet-магазинах продается.


 
Anatoly Podgoretsky ©   (2002-12-05 11:46) [7]

Там вообще не понятно, сначала присваивается статический масси, а потом сразу де зачем то заменяется на динамически выделенную память, имитирующию этот массив.
А верно или неверно делает коипилятор определить нельзя, так как как не приведено описание PA


 
Внук ©   (2002-12-05 11:54) [8]

Anatoly Podgoretsky © (05.12.02 11:46)
Действительно, ерунда. Я прочитал это как
type
a:array[100] of integer;
var
pa:=^a;
i,n:integer;
begin
...
Тогда есть смысл...


 
LongIsland ©   (2002-12-05 11:58) [9]

А мне показалось, что он все-таки сослался на область из 100 integer"ов. Тогда GetMem(pa,n*sizeof(integer));, если n = 10 смысла не имеет.

Что не так?


 
Anatoly Podgoretsky ©   (2002-12-05 12:23) [10]

Да нет у него объявлен статический массив
var
a:array[100] of integer;

Вот здесь этот массив присваивается указателю

pa:=^a;

А вот здесь этот указатель сразу заменяется на динамически выделенну. область

GetMem(pa,n*sizeof(integer));

Если же нужен действительно динамический массив, то его надо и использовать, а не мамостоятельно выделять память и отслеживать это в дальнейшем
a:array of integer;

PA совсеи не нужен


 
Misha   (2002-12-05 14:03) [11]

Прошу прощения, за свои опечатки, мой пример выглядит так
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;



 
perov ©   (2002-12-05 14:44) [12]

А в какой версии Делфи можно так описывать массивы
array[100] of integer ?
Нижняя граница чему равна? 0 или 1?


 
Anatoly Podgoretsky ©   (2002-12-05 15:41) [13]

Pa указатель на Ta, который соответствующего размера, так что все правильно


 
Дельфятник   (2002-12-05 16:04) [14]

А у меня есть такой вопрос. Бывают ли утечки памяти прри работе с динамическим массивом?
То есть, если в процедуре есть локальная переменная a: array of Integer и в этой процедуре этот массив заполняется чем-то, то нужно ли в конце писать a:=nil или нет?



Страницы: 1 вся ветка

Текущий архив: 2002.12.16;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.012 c
14-51935
Карлсон
2002-11-25 18:38
2002.12.16
а 2003 год - год кого?


4-52035
cardinal
2002-10-31 02:36
2002.12.16
Как узнать адреса процессов в w98?


1-51741
Pan
2002-12-06 12:40
2002.12.16
Быстрое определение формата файлов DOC и XLS


1-51767
Cranium
2002-12-04 21:11
2002.12.16
Ярлык


14-51926
Anatoly Podgoretsky
2002-11-23 14:34
2002.12.16
Именинники 23 ноября