Потери динамически распределяемой памяти
При использовании динамически распределяемых переменных час- то возникает общая проблема, называемая утечкой динамической па- мяти. Утечка памяти - это ситуация, когда пространство выделяется в динамически распределяемой памяти и затем теряется - по ка- ким-то причинам ваш указатель не указывает больше на распределен- ную область, так что вы не можете освободить пространство.
Общей причиной утечек памяти является переприсваивание дина- мических переменных без освобождения предыдущих. Простейшим слу- чаем является следующий:
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.