Кент Рейсдорф. BORLAND C++BUILDER. Раздел 1
Кент Рейсдорф. BORLAND C++BUILDER. Страница 66
Monster* swampThing = 0;
// затем, при выходе из программы...
delete swampThing;
В этом случае вам не нужно думать о том, была ли когда-нибудь выделена память под объект. Использование delete безопасно, если указатель содержит адрес объекта или NULL.
Другой способ решения проблемы повторного уничтожения объекта — сравнение указателя с нулем до вызова delete:
if (swampThing) delete swampThing;
При этом предполагается, что вы установили указатель в 0 после уничтожения объекта в другой части программы. Можно использовать любой из способов; главное, чтобы вы не забывали это делать всякий раз, когда возможно повторное применение оператора delete к указателю.
Вы поняли теперь, какая ошибка была в программах POINTER и REF- ERENC? Эти программы расходовали системную память. Я создавал массив структур, размещая их в «куче», и ни разу не освобождал выделяемую память. Чтобы исправить положение, нужно добавить несколько строк в самый конец программы:
Теперь программа работает абсолютно правильно. Я перебрал массив указателей и уничтожил каждую структуру.
Создавая массив с помощью оператора new, вы на самом деле используете версию new[] этого оператора. Вам не обязательно знать подробности его работы, но вы должны уметь правильно уничтожать динамические массивы. Ранее я приводил пример динамического размещения символьного массива. Вот тот же самый фрагмент кода, в который добавлен оператор delete[]:
Обратите внимание, что оператор называется delete[], а не просто delete. Я не буду вдаваться в технические подробности того, что здесь происходит, но эта операция гарантирует правильное уничтожение всех элементов массива. Следите за тем, чтобы при использовании динамического массива память освобождалась с помощью оператора delete[].