var ps : ^string;

begin

ps^:=’Hello !’; { В указателе мусор – нельзя обращаться через него }

end.

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

Обращение через пустой указатель

var ps : ^string;

begin

ps := nil;

ps^:=’Hello !’; { Указатель пуст – нельзя обращаться через него }

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); { Первую переменную освободить можно… }

Вы читаете Песни о Паскале
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату