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