Связь и интернет Архив Программирование
   
Сделать стартовойСделать закладку            
   ПОИСК  
   
Главная / Pascal и Delphi / Borland Pascal / Использование указателей /
8  Perl
8  PHP
8  JavaScript
8  HTML
8  DHTML
8  XML
8  CSS
8  C / C++
8  Pascal и Delphi
8  Турбо Ассемблер
8  MySQL
8  CASE-технологии
8  Алгоритмы
8  Python
8  Обратная связь
8  Гостевая книга
Новости о мире


Потери динамически распределяемой памяти - Программирование от RIN.RU
Потери динамически распределяемой памяти

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


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


var IntPointer: ^Integer;


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


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


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


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


var IntPointer: ^Integer;


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




 8  Комментарии к статье  8 8  Обсудить в чате

8  В тему

Для чего используются указатели?

Работа с большими объемами данных

Работа с данными неизвестного размера

Работа с временными буферами данных

Связанные списки

Выделение памяти для динамических переменных

Процедуры GetMem и FreeMem

Общие проблемы использования указателей

Управление связанным списком

 
  
  
    Copyright ©  RIN 2003 - 2004      * Обратная связь