Основы программирования. Указатели. Динамические структуры данных. Абстрактные типы данных. Классы - 15 стр.

UptoLike

Составители: 

17
2. «Висячие» указатели.
После освобождения динамической памяти указатель продолжает указывать
на старое место. Такие указатели называются «висячими». Попытка записи по та-
кому указателю не приводит к немедленной ошибке. Однако память, на которую
он указывает, могла быть уже выделена другой динамической переменной, и по-
пытка записи приведет к порче этой переменной.
var
pi: ^integer;
begin
New(pi);
pi^:=5;
Dispose(pi); // указатель становится "висячим"
...
pi^:=6; // ошибка!
Если после Dispose(pi) сразу написать pi:=nil, то в дальнейшем при по-
пытке разыменовать нулевой указатель pi возникнет исключение, что является
более предпочтительным, чем скрытая ошибка изменения другой переменной.
Данный прием следует взять на вооружение и после освобождения динамической
переменной обнулять указатель:
Dispose(pi);
pi:=
nil;
3. «Утечка» памяти.
Данная ошибка возникает, когда память не освобождается, но перестает кон-
тролироваться указателем. Подобную ошибку называют «утечкой» памяти, по-
скольку такую память невозможно освободить. Такая ошибка труднонаходима,
поскольку практически не сказывается на работе приложения. Однако при систе-
матических утечках программа требует все больше памяти у операционной сис-
темы, замедляя
работу других приложений. Далее приводятся две распространен-
ные ситуации, в которых возникает утечка памяти.
Пример 1. Повторное выделение памяти.
Если выделить память повторно для того же указателя, то ранее выделенная
память «утечет»:
var pi: ^integer;
begin
New(pi);
pi^:=5;
New(pi);
Пример 2. Выделение памяти под локальную переменную без освобождения.
procedure pp;
var pi: ^integer;
5
pi