ВУЗ:
Составители:
Рубрика:
16
являющаяся указателем на этот тип. С помощью GetMem выделяется нужное ко-
личество памяти, определяемое в процессе работы программы; адрес выделенной
памяти записывается в переменную dyn. С этого момента можно обращаться к
элементам массива, используя запись вида dyn^[0]. Операцию разыменования в
Delphi можно опускать, поэтому с dyn можно обращаться как с обычным
масси-
вом: dyn[0]. В конце работы с таким массивом следует вызвать
FreeMem(dyn).
Отметим, что при включенном режиме проверки выхода за границы диапазо-
на {$R+} нельзя выделять под массив память, превосходящую его размер, то есть
должно выполняться условие n<=sz. Поэтому следует задавать размер массива
sz максимально возможным. В Delphi память, занимаемая переменной
любого
типа, не должна превосходить 2 Гб, т.е. MaxInt байт. Поскольку элементы мас-
сива имеют тип integer, то в качестве sz выбрано максимально возможное
значение MaxInt div sizeof(integer).
1.7 Ошибки при работе с динамической памятью
Как было отмечено, при работе с динамической памятью можно совершить
большое количество ошибок, которые имеют различные последствия и различную
степень тяжести. Большинство этих ошибок проявляется не сразу, а через некото-
рое время в процессе выполнения программы. Следовательно, такие ошибки
труднонаходимы и потому особенно опасны. Используя принцип «предупрежден
– значит, вооружен», перечислим
наиболее часто встречающиеся варианты оши-
бок при работе с динамической памятью.
1. Попытка воспользоваться неинициализированным указателем.
var pi: ^integer;
i: integer;
begin
pi^:=5;
Если pi – глобальная переменная, то она автоматически инициализируется нуле-
вым значением, т.е. имеет значение nil. Разыменование нулевого указателя при-
водит к ошибке времени выполнения. Если pi – локальная переменная, то она по
умолчанию не инициализируется, а поэтому содержит непредсказуемое значение.
Это значение трактуется как адрес целой переменной, к которой осуществляется
доступ. Как правило, в этой ситуации возникает исключение Access Violation (на-
рушение защиты доступа), но по чистой случайности может оказаться, что указа-
тель pi содержит истинный адрес переменной программы, тогда переменная бу-
дет изменена, выполнение
программы продолжится дальше, а факт изменения пе-
ременной непредсказуемым образом повлияет на дальнейшее выполнение про-
граммы.
Страницы
- « первая
- ‹ предыдущая
- …
- 12
- 13
- 14
- 15
- 16
- …
- следующая ›
- последняя »