Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.12.16;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.009 c
1-51753
kingdom
2002-12-04 12:39
2002.12.16
Очень нужен LanManager.zip!!


1-51785
Данил
2002-12-04 12:14
2002.12.16
Как убрать кнопку закрытия пристыкованной формы?


14-51909
Nox
2002-11-21 14:54
2002.12.16
Еда для программеров


14-51900
Senka
2002-11-24 17:15
2002.12.16
Как запустить Inter Base сервер


1-51682
avsh
2002-12-05 18:57
2002.12.16
TImage





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский