Язык программирования C++. Вводный курс


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


Важно понимать разницу между временем жизни указателя pi и объекта, который он адресует. Сам объект pi является глобальным и объявлен в глобальной области видимости. Следовательно, память под него выделяется до выполнения программы и сохраняется за ним до ее завершения. Совсем не так определяется время жизни адресуемого указателем pi

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

объект pi

становится висячим указателем, то есть ссылается на область памяти, не принадлежащую программе. Такой указатель служит источником трудно обнаруживаемых ошибок, поэтому сразу после уничтожения объекта ему полезно присвоить 0, обозначив таким образом, что указатель больше ни на что не ссылается.

Оператор 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; // безопасно

}

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

·                  не освободить выделенную память. В таком случае память не возвращается в хип. Эта ошибка получила название утечки




Начало  Назад  Вперед



Книжный магазин