Кент Рейсдорф. 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[] и delete[]

Создавая массив с помощью оператора new, вы на самом деле используете версию new[] этого оператора. Вам не обязательно знать подробности его работы, но вы должны уметь правильно уничтожать динамические массивы. Ранее я приводил пример динамического размещения символьного массива. Вот тот же самый фрагмент кода, в который добавлен оператор delete[]:

Обратите внимание, что оператор называется delete[], а не просто delete. Я не буду вдаваться в технические подробности того, что здесь происходит, но эта операция гарантирует правильное уничтожение всех элементов мас­сива. Следите за тем, чтобы при использовании динамического массива па­мять освобождалась с помощью оператора delete[].

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