С++ для начинающих




Динамическое создание и уничтожение единичных объектов - часть 3


Оператор delete может использоваться только по отношению к указателю, который содержит адрес области памяти, выделенной в результате выполнения оператора new. Попытка применить delete к указателю, не ссылающемуся на такую память,  приведет к непредсказуемому поведению программы. Однако, как было сказано выше, этот оператор можно применять к нулевому указателю.

Ниже приведены примеры опасных и безопасных операторов delete:

void f() {

    int i;

    string str = "dwarves";

    int *pi = &i;

    short *ps = 0;

    double *pd = new doub1e(33);

    delete str; // плохо: str не является динамическим объектом

    delete pi; // плохо: pi ссылается на локальный объект

    delete ps; // безопасно

    delete pd; // безопасно

}

Вот три основные ошибки, связанные с динамическим выделением памяти:

  • не освободить выделенную память. В таком случае память не возвращается в хип. Эта ошибка получила название утечки памяти;
  • дважды применить оператор delete к одной и той же области памяти. Такое бывает, когда два указателя получают адрес одного и того же динамически размещенного объекта. В результате подобной ошибки мы вполне можем удалить нужный объект. Действительно, память, освобожденная с помощью одного из адресующих ее указателей, возвращается в хип и затем выделяется под другой объект. Затем оператор delete применяется ко второму указателю, адресовавшему старый объект, а удаляется при этом новый;
  • изменять объект после его удаления. Такое часто случается, поскольку указатель, к которому применяется оператор delete, не обнуляется.
  • Эти ошибки при работе с динамически выделяемой памятью гораздо легче допустить, нежели обнаружить и исправить. Для того чтобы помочь программисту, стандартная библиотека С++ представляет класс auto_ptr. Мы рассмотрим его в следующем подразделе. После этого мы покажем, как динамически размещать и уничтожать массивы, используя вторую форму операторов new и delete.




    Содержание  Назад  Вперед