Кент Рейсдорф. BORLAND C++BUILDER. Раздел 1
Кент Рейсдорф. BORLAND C++BUILDER. Страница 65
Вся выделенная память должна быть освобождена после использования. Для локальных объектов это происходит автоматически, и вам не нужно принимать специальные меры. Менеджер памяти по мере необходимости выделяет память для ваших объектов в стеке и освобождает ее, когда объекты выходят из области видимости (обычно при возврате из функции или завершении блока, в котором был объявлен объект). При динамическом распределении программист должен сам отвечать за освобождение памяти, выделенной с помощью оператора new.
Освобождение памяти, выделенной с помощью оператора new, осуществляется оператором delete.
Использование оператора delete крайне просто:
SomeObject* myObject = new SomeObject;
// использование myObject
delete myObject; // до свидания!
Вот и все! Вам следует только знать некоторые особенности использования delete с указателями. Во-первых, нельзя применять оператор delete к указателю дважды, в противном случае может возникнуть нарушение защиты и прочие неприятности. Во-вторых, вполне допустимо применять delete к указателю, установленному в 0. Но чему это соответствует на практике? Сейчас объясню.
Иногда вы объявляете указатель, предполагая его дальнейшее использование, но не зная точно, будет ли он использован в данной программе. Например, вы создаете некоторый объект только в том случае, если пользователь выберет один из пунктов меню. Если этот пункт ни разу не был выбран, объект не создается. Пока все идет хорошо. Проблема состоит в том, что нужно освободить память только в случае создания объекта. Применение delete к инициализированному указателю опасно, т.к. вы не знаете, на какое место в памяти он указывает. Существуют два возможных решения.
Я говорил раньше, что стоит инициализировать указатели нулем, если вы не используете их немедленно. Для этого есть две причины. Об одной я уже говорил (неинициализированный указатель содержит случайное значение, что нежелательно). Вторая заключается в том, что к указателю со значением NULL можно применить delete независимо от того, был ли этот указатель ранее использован: