Borland Pascal. Руководство пользователя
6cac1dc9

Потери динамически распределяемой памяти


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

Общей причиной утечек памяти является переприсваивание дина- мических переменных без освобождения предыдущих. Простейшим слу- чаем является следующий:

var IntPointer: ^Integer;

begin New(IntPointer); New(IntPointer); end.

Пример 8.6 Простая утечка памяти.

При первом вызове New в динамически распределяемой памяти выделяется 8 байт, и на них устанавливается указатель IntPointer. Второй вызов New выделяет другие 8 байт, и IntPointer устанавли- вается на них. Теперь у вас нет указателя, ссылающегося на первые 8 байт, поэтому вы не можете их освободить. В программе эти байты будут потеряны.

Естественно, утечка памяти может быть не такой очевидной, как в Примере 8.6. Выделение памяти почти никогда не происходит в последовательных операторах, но может выполняться в отдельных процедурах или далеко отстоящих друг от друга частях программы. В любом случае лучший способ отслеживания динамических переменных - это установка их в nil при освобождении. Тогда при попытке расп- ределить их снова вы можете убедиться что они имеют значение nil:

var IntPointer: ^Integer;

begin New(IntPointer); . . . Dispose(IntPointer); IntPointer := nil; . . . if IntPointer = nil then New(IntPointer); end.



Содержание раздела