Согласие на обработку персональных данных.

01.07.2019
Новый выпуск журнала Автоматизация и программирование.

26.06.2019
Новые видео и статья Функция Eof.

19.06.2019
Новая задача Генератор наборов символов.

08.04.2019
Новый выпуск журнала Автоматизация и программирование.

27.04.2019
Новые видео и статья Процедура Dispose.



Раздел: Стандартные функции Паскаля

Процедура Dispose

Процедура Dispose в Паскале выполняет освобождение памяти. Синтаксис:

 
procedure Dispose(P: Pointer);

procedure Dispose(P: TypedPointer; Des: TProcedure);  

Освобождение памяти в Паскале (как и в большинстве других языков) требуется после того, как динамически выделенная память становится больше не нужна.

После работы с памятью ее надо освободить, иначе после завершения программы в памяти останется «мусор». Кроме того, хотя операционная система следит за тем, чтобы освобождать память после завершения программ, делает она это, прямо сказать, не всегда хорошо (речь о Windows, про другие системы не знаю).

Поэтому могут возникать такие неприятности, как утечка памяти. Что в худшем случае может привести к полному зависанию компьютера.

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

Первая форма процедуры Dispose освобождает память, выделенную с помощью вызова процедуры New. Указатель Р должен быть типизированным. Освобожденная память возвращается в кучу.

Вторая форма процедуры Dispose принимает в качестве первого параметра указатель на тип объекта, а в качестве второго параметра - имя деструктора этого объекта. Деструктор будет вызван, и память, выделенная для объекта, будет освобождена.

Если указатель не связан с каким-либо местом в куче (например, является пустым), то при вызове процедуры Dispose возникнет ошибка времени выполнения.

Рассмотрим только пример использования первого варианта:

procedure Dispose(Указатель);

Где Указатель – переменная, которая ранее использовалась с процедурой New для выделения памяти. Соответственно, процедура Dispose освобождает блок памяти, выделенный ранее процедурой New.

Пример:

New(PMas); //Выделить память
//…
//Здесь поработали
//…
Dispose(PMas); //Освободить память
PMas := NIL;   //Уничтожить указатель

Здесь, кроме освобождения памяти, мы ещё указателю присваиваем нулевое значение (то есть уничтожаем его). Это не обязательно, однако лучше это делать, иначе может возникнуть ошибка во время выполнения программы (в Паскале я такого не встречал, но в С++ бывало).

Пример программы:

program disposep;

const MAX_MAS = 8;  //Кол-во элементов в массиве

type TMas = array[1..MAX_MAS] of integer; //Массив - новый тип данных

var i    : integer; //Индексная переменная
    PMas : ^TMas;   //Указатель на наш массив

//*******************************************************************
// ОСНОВНАЯ ПРОГРАММА
//*******************************************************************
begin
  New(PMas);               //Выделить память
  for i := 1 to MAX_MAS do //Вывести содержимое массива
  WriteLn(PMas^[i]);
  WriteLn;
  FillDWord(PMas^, SizeOf(PMas^), 0); //Заполнить массив нулями
  for i := 1 to MAX_MAS do            //И снова вывести
  WriteLn(PMas^[i]);
  Dispose(PMas);           //Освободить память

  //Dispose(PMas);         //!!! Второй раз вызывать нельзя,
                           //т.к. указатель уже никуда не ссылается

  WriteLn('Then end. Press ENTER...');
  ReadLn;
end.

ПРИМЕЧАНИЕ
Если вы смутно представляете, что такое динамическая память и указатели, а такие слова как “куча” вызывают у вас недоумение, то советую ознакомиться с книгой “Куда указывают указатели”.


Как стать программистом 2.0 Как стать программистом 2.0

Эта книга для тех, кто хочет стать программистом. На самом деле хочет, а не просто мечтает. И хочет именно стать программистом с большой буквы, а не просто научиться кулебякать какие-то примитивные программки… Подробнее...
Инфо-МАСТЕР ®
Все права защищены ©
e-mail: mail@info-master.su

Яндекс.Метрика