Кент Рейсдорф. BORLAND C++BUILDER. Раздел 1

Кент Рейсдорф. BORLAND C++BUILDER. Страница 65

Оператор delete

Вся выделенная память должна быть освобождена после использования. Для локальных объектов это происходит автоматически, и вам не нужно принимать специальные меры. Менеджер памяти по мере необходимости вы­деляет память для ваших объектов в стеке и освобождает ее, когда объекты выходят из области видимости (обычно при возврате из функции или завер­шении блока, в котором был объявлен объект). При динамическом распре­делении программист должен сам отвечать за освобождение памяти, выде­ленной с помощью оператора new.

Освобождение памяти, выделенной с помощью оператора new, осу­ществляется оператором delete.

Использование оператора delete крайне просто:

SomeObject* myObject = new SomeObject;

// использование myObject

delete myObject; // до свидания!

Вот и все! Вам следует только знать некоторые особенности использования delete с указателями. Во-первых, нельзя применять оператор delete к ука­зателю дважды, в противном случае может возникнуть нарушение защиты и прочие неприятности. Во-вторых, вполне допустимо применять delete к указателю, установленному в 0. Но чему это соответствует на практике? Сейчас объясню.

Иногда вы объявляете указатель, предполагая его дальнейшее использо­вание, но не зная точно, будет ли он использован в данной программе. Например, вы создаете некоторый объект только в том случае, если пользо­ватель выберет один из пунктов меню. Если этот пункт ни разу не был выбран, объект не создается. Пока все идет хорошо. Проблема состоит в том, что нужно освободить память только в случае создания объекта. Применение delete к инициализированному указателю опасно, т.к. вы не знаете, на какое место в памяти он указывает. Существуют два возможных решения.

Я говорил раньше, что стоит инициализировать указатели нулем, если вы не используете их немедленно. Для этого есть две причины. Об одной я уже говорил (неинициализированный указатель содержит случайное значе­ние, что нежелательно). Вторая заключается в том, что к указателю со зна­чением NULL можно применить delete независимо от того, был ли этот указатель ранее использован:

Web-дизайн (с) 2010 All rights reserved