Чтение онлайн

на главную - закладки

Жанры

Шрифт:

end.

Урок предыдущего примера справедлив и здесь: обращение к памяти через пустой указатель тоже вызовет крах программы.

Обращение к уничтоженной переменной (висячие ссылки)

var ps : ^string;

begin

New(ps); ps^:=’Hello !’; { Это нормально }

Dispose(ps);

ps^:=’Bye !’; { Здесь ошибка, – переменной уже нет! }

end.

После освобождения памяти, занимаемой динамической переменной, обращаться к ней уже нельзя. Вот другой пример такой ошибки:

var p1, p2 : ^string;

begin

New(p1);

p2 := p1; {

адрес динамической переменной копируется в другой указатель }

Dispose(p2); { Переменная освобождается через указатель p2 }

p1^:=’Hello !’; { Это ошибка, – переменной уже нет! }

Dispose(p1); { Это тоже ошибка ! }

end.

Здесь все тоньше. Динамическая переменная создана через один указатель, и её адрес скопирован в другой. Теперь можно обращаться к переменной и освобождать её через любой из них. Но после освобождения все ссылки на переменную теряют силу! Обратиться к ней, или повторно освободить уже нельзя!

Утечка памяти

Эта ошибка преследует даже опытных программистов. Её трудно заметить, поскольку расплата наступает после исчерпания всей памяти, а этого можно и не дождаться. В действительности никакой утечки памяти не происходит, правильней назвать это захламлением памяти или потерей ссылки на переменную. Итак, смотрим:

var p1, p2 : ^string;

begin

New(p1); New(p2); { создаем две динамические переменные }

p2 := p1; { адрес первой переменной копируется во второй указатель }

Dispose(p1); { Первую переменную освободить можно… }

Dispose(p2); { … а вторую – уже нельзя! }

end.

Здесь вторая переменная существует и после того, как указатель p2 переключился на первую. Но связь с нею потеряна навсегда, эту переменную нельзя даже освободить! Так объём свободной памяти в куче уменьшается, что и породило выражение «утечка памяти».

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

В последующих главах мы построим несколько «боевых» программ с применением динамических переменных.

Итоги

• В задачах, где нельзя предсказать объём обрабатываемых данных, используют динамические переменные.

• Память для динамических переменных выделяется из кучи – области свободной памяти, которой «заведует» операционная система.

• У динамических переменных нет имен, поэтому доступ к ним возможен только через указатели.

• Для выделения памяти вызывают процедуру New, она помещает в указатель адрес созданной переменной.

• Когда надобность в динамической переменной отпадает, занятую ею память освобождают процедурой Dispose.

• Обращение с динамическими переменными требует аккуратности; остерегайтесь таких ошибок, как висячие ссылки и утечка памяти.

А слабо?

А) Сравните размеры переменных и указателей на них, воспользуйтесь для этого следующей программкой. Напишите нечто подобное для переменных других типов.

type pb = ^byte; pw = ^word; pe = ^extended;

var b : byte; w : word; e : extended;

begin

Writeln(SizeOf(b):5, SizeOf(pb):5);

Writeln(SizeOf(w):5, SizeOf(pw):5);

Writeln(SizeOf(e):5, SizeOf(pe):5);

Readln;

end.

Б)

Найдите ошибки в следующей программе и объясните их.

var p1, p2 : ^integer;

begin

p1 := 10;

p2^:= 20;

New(p1);

p2:= p1;

p1^:= 'Привет!';

Dispose(p1);

Dispose(p2);

end.

Задачи на темы предыдущих глав

В) Ник обожал музыку. Но компьютерный музыкальный проигрыватель раздражал программиста, поскольку при случайном выборе мелодий повторял одни песни, напрочь забывая о других. Предположим, в списке 10 песен, но звучали только три из них: 3, 6, 5, 6, 3, 6, 5 и т.д.

Ник создал «справедливый» проигрыватель, выбирающий мелодии иначе. Все песни состояли в одном из двух списков: «белом» или «черном». Изначально все они были в «белом» списке, и очередная мелодия выбиралась из него случайно, а после проигрывания ставилась в конец «черного». Если в этот момент в «черном» списке состояла половина мелодий, то первая мелодия из «черного» списка возвращалась в «белый». Затем снова случайно выбиралась мелодия из «белого» списка. Так гарантировалось отсутствие повторов ранее проигранных песен в течение достаточно длительного времени. Создайте программу, генерирующую случайные числа (мелодии) в диапазоне от 1 до N представленным выше методом. Значение N не превышает 255.

Г) Распечатывая числовое множество, мы выводили все его элементы по одному, не заботясь об экономии бумаги или места на экране. Напишите экономную процедуру печати множества, учитывающую подряд идущие диапазоны чисел. Вот примеры желаемой распечатки:

1,5..255

0..200,210..255

0..255

2,5,7,10..20,30..40

Глава 53

Массив указателей

Мы научились создавать переменные по мере надобности – динамически. Эти переменные поселяются в куче, но доступны через указатели, что расположены в секции данных или в стеке – статической памяти программы. Взглянете на рис. 118, где каждая клеточка соответствует байту.

Рис.118 – Указатели на динамические переменные

Поделиться:
Популярные книги

Отмороженный

Гарцевич Евгений Александрович
1. Отмороженный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Отмороженный

Убивать чтобы жить 2

Бор Жорж
2. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 2

Кодекс Охотника. Книга XIX

Винокуров Юрий
19. Кодекс Охотника
Фантастика:
фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга XIX

Дворянская кровь

Седой Василий
1. Дворянская кровь
Фантастика:
попаданцы
альтернативная история
7.00
рейтинг книги
Дворянская кровь

Вечный. Книга II

Рокотов Алексей
2. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга II

Инквизитор Тьмы 6

Шмаков Алексей Семенович
6. Инквизитор Тьмы
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Инквизитор Тьмы 6

Свадьба по приказу, или Моя непокорная княжна

Чернованова Валерия Михайловна
Любовные романы:
любовно-фантастические романы
5.57
рейтинг книги
Свадьба по приказу, или Моя непокорная княжна

Леди Малиновой пустоши

Шах Ольга
Любовные романы:
любовно-фантастические романы
6.20
рейтинг книги
Леди Малиновой пустоши

Морской волк. 1-я Трилогия

Савин Владислав
1. Морской волк
Фантастика:
альтернативная история
8.71
рейтинг книги
Морской волк. 1-я Трилогия

Скандальная свадьба

Данич Дина
1. Такие разные свадьбы
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Скандальная свадьба

Сердце для стража

Каменистый Артем
5. Девятый
Фантастика:
фэнтези
боевая фантастика
9.20
рейтинг книги
Сердце для стража

Здравствуй, 1984-й

Иванов Дмитрий
1. Девяностые
Фантастика:
альтернативная история
6.42
рейтинг книги
Здравствуй, 1984-й

Инквизитор Тьмы 5

Шмаков Алексей Семенович
5. Инквизитор Тьмы
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Инквизитор Тьмы 5

Курсант: Назад в СССР 4

Дамиров Рафаэль
4. Курсант
Фантастика:
попаданцы
альтернативная история
7.76
рейтинг книги
Курсант: Назад в СССР 4