TURBO PASCAL

Новости

Программы   

Turbo Pascal 

Игры

Документация   

Странности

FAQ

Ссылки

Форум

Гостевая книга

Рассылка

Благодарности

Об авторе

 

 

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

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

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

             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.

Содержание

На первую страницу

Rambler's Top100 Rambler's Top100
PROext: Top 1000

(с)Все права защищены

По всем интересующим вопросам прошу писать на электронный адрес

Hosted by uCoz