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.