Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекций по дисциплине Объектно-ориентирован...doc
Скачиваний:
33
Добавлен:
01.07.2025
Размер:
14 Мб
Скачать
☆

1. Динамическое распределение памяти

Динамическое распределение памяти широко используется для экономии вычислительных ресурсов. Те переменные или объекты, которые становятся ненужными, уничтожаются, а освобожденное место используется для новых переменных или объектов.

Для динамического распределения выделяется специальная область памяти — heap (куча). Динамическое распределение памяти в этой области может производиться двумя различными способами: с помощью процедур New и Dispose и процедурами GetMem и FreeMem.

При первом способе выделение памяти производится процедурой

procedure New(<имя указателя>);

где <имя указателя> — имя переменной, являющейся типизированным указателем. Этой переменной при успешном завершении процедуры пе­редается адрес начала выделенной области памяти. Размер выделяемой области определяется размером памяти, необходимым для размещения того типа данных, который указан при объявлении указателя.

Освобождение памяти, динамически выделенной процедурой New, осуществляется процедурой Dispose:

procedure Dispose(<имя указателя>);

В эту процедуру должен быть передан тот указатель, в котором хранится адрес области памяти, выделенной ранее процедурой New. Для приведенных выше примеров соответствующие процедуры Dispose могут быть записаны следующим образом:

Dispose(Р) ;

Dispose(Pr) ;

Второй способ динамического выделения памяти связан с применением проце­дур GetMem для выделения памяти и FreeMem для ее освобождения. Они имеют следующий синтаксис:

procedure GetMem(<имя указателя>,<объем памяти в байтах>); procedure FreeMem(<имя указателя>,<объем памяти в байтах>);

В отличие от процедур New и Dispose здесь задается не только указатель, в ко­тором устанавливается процедурой GetMem и читается процедурой FreeMem адрес выделенной области памяти, но и указывается объем памяти в байтах.

2. Исключения

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

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

Если исключение не перехвачено нигде в программе, то оно обрабатывается методом TApplication.HandleException. Он обеспечивает стандартную реакцию программы на большинство исключений — выдачу пользователю краткой информации в окне сообщений и уничтожение экземпляра исключения.

Если хотите, то можете отключить появление этих сообщений. В Delphi 5 для этого надо выполнить команду Tools | Debugger Options, в открывшемся диалоговом окне выбрать страницу Language Exceptions и на ней выключить опцию Stop On Delphi Exceptions.

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