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