Род Стивенс

Книги → Delphi. Готовые алгоритмы → Глава 2. Списки

Numltems := StrToInt (NumltemsText.Text);

GetMem(Items,NumItems*SizeOf(Integer)) ;

// Заполнение массива значениями.

for i : = 1 to Numltems do

begin ,

Items^ti] := i;

Txt := txt+IntToStr (Items^i] ) + " ;

end;

ItemsLabel. Caption := txt;

// Освобождение массива.

FreeMem(Items) ;

end;

Изменение размеров массива — мощная, но несколько опасная методика. Ра­ботая с массивом, Delphi не определяет его размер. В программе SizeArr Delphi воспринимает массив как указатель, содержащий миллионячеек. Если программа фактически выделила память только для 10 элементов, Delphi не определит по­пытку доступа к 100-му элементу как ошибку. Вместо того чтобы выдать при компи­ляции сообщение о том, что индекс массива вышел за пределы, во время выполне­ния программа будет пытаться сделать запись в 100-ю позицию массива. В лучшем случае обращение к этой ячейке памяти просто остановит работу программы. В худ­шем это вызовет неявный сбой, который будет очень сложно найти.

Подобная проблема возникает, если программа использует неверно заданную нижнюю границу массива. Предположим, что тип массива определен так, как опи­сано в следующем фрагменте кода:

TIntArray = array [1..1000000] of Integer;

Подобную ошибку допустить очень просто. Неприятности начнутся, когда программа попробует обратиться к элементу массива в нулевой позиции.

При объявлении в процедуре нового массива, такого как PIntArray, его гра­ницы не указывался. Необходимо помнить, какой тип массива вы определили да­лее в программе.

Программа освобождает выделенную для обычного массива память, когда он выходит из области видимости. Например, массив, объявленный в пределах про­цедуры, автоматически освобождается, когда процедура заканчивается.

С другой стороны, память, выделенная с помощью процедуры GetMem, остает­ся таковой до тех пор, пока не освободится с помощью процедуры FreeMem. Пока программа не будет завершена, доступа к памяти не будет. При этом неоднократ­ный вызов процедуры занимает много системной памяти.

Наконец, существенную проблему создает обращение к памяти, освобожден­ной процедурой FreeMem. Если программа освобождает память массива и затем обращается к этому массиву, то следствием может быть либо ее остановка, либо неявный сбой. Можно сократить вероятность возникновения такого эффекта, сбрасывая указатель массива на нуль после освобождения памяти. В этом случае вместо неявного сбоя попытка обращения к массиву вызовет ошибку нарушения доступа.

Несмотря на подстерегающие опасности изменение размеров массива - очень мощная методика. При работе со списками, меняющими свой размер, она позволя­ет достигать очень высокой производительности.

← предыдущая следующая →

Страницы раздела: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

Публикация компанией Dropbox кода Zulip – средства общения для IT-разработчиков

20.11.2015
Одной из одобрительно встреченных программистами инициатив, реализующихся в рамках акции Hack Week, стала публикация исходного кода приложения Zulip – веб-приложения для общения между собой разработчиков в сфере IT-технологий.

Объединение ОС Android и Chrome

17.11.2015
Слухи об объединении двух крупнейших ОС компании Google, Android и Chrome, гуляют по Интернету уже более 5 лет, но до сих пор этого не случилось, хотя очевидно, что с течением времени эти ОС становятся всё более похожими: так, в последнее время появилось немало Android-устройств, к которым прилагаются клавиатуры, а Chrome OS «научилась» работать с сенсорными экранами.

Конференция Linux Piter 2015

15.11.2015
Уже почти через неделю в Санкт-Петербурге впервые в истории пройдёт конференция, посвящённая проблемам свободного программного обеспечения – Linux Piter 2015.