Вход/Регистрация
Справочное руководство по C++
вернуться

Страустрап Бьярн

Шрифт:

Деструктор может быть виртуальным.

В деструкторе можно вызывать функцию-член, см. §R.12.7.

Объект класса с деструктором не может быть членом объединения.

Деструкторы вызываются неявно в следующих случаях:

(1) когда исчезают из области видимости объекты auto (§R.3.5) или временные объекты (§R.12.2, §R.8.4.3);

(2) при завершении программы (§R.3.4) для построенных статических объектов (§R.3.5);

(3) благодаря обращению к операции delete (§R.5.3.4) для объектов, созданных с помощью операции new (§R.5.3.3);

(4) при явном вызове.

Когда деструктор вызывается операцией delete, то он освобождает память для самого большего из производных классов (§R.12.6.2) того объекта, который использовал операцию delete (§R.5.3.4), например:

class X {

 //…

 public:

 X(int);

 ~X;

};

void g(X*);

void f // общий случай

{

 X* p = new X(111); // размещение и инициализация

 g(p);

 delete p; // освобождение и удаление

}

Явные вызовы деструкторов применяются редко. Примером этого может служить вызов деструктора для объектов, созданных в некоторой определенной адресной области с помощью операции new. Размещение объектов в определенном адресном пространстве и последующее уничтожение их может потребоваться для использования специфических возможностей аппаратуры и для правильного функционирования оперативной памяти. Приведем пример:

void* operator new(size_t, void* p) { return p; }

void f(X* p);

static char buf[sizeof(X)];

void g // редкий, специальный случай

{

 X* p = new(buf) X(222); // размещение в buf[] и инициализация

 f(p);

 p-›X::~X; // удаление

}

Обозначения, использованные для явного вызова деструктора, можно использовать для имени любого простого типа, например,

int* p;

//…

p-›int::~int;

Использование такой записи для типа, у которого нет деструктора, проходит бесследно. Допуская такую запись, мы разрешаем пользователям писать программу, не задумываясь над тем, есть ли данного типа деструктор.

R.12.5 Свободная память

Когда создается объект с помощью операции new, для получения свободной памяти вызывается (неявно) функция operator new (§R.5.3.3).

Если функция operator new не может выполнить запрос, она возвращает 0.

В классе X функция X::operator new является статическим членом, даже если она не описана явно как static. Первый ее параметр должен иметь тип size_t, - зависящий от реализации целочисленный тип, который определен в стандартном заголовочном файле ‹stddef.h›, и она должна возвращать значение типа void*, например:

class X {

 //…

 void* operator new(size_t);

 void* operator new(size_t, Arena*);

};

Правила выбора подходящей функции operator new обсуждаются в §R.5.3.3.

В классе X функция X::operator delete является статическим членом, даже если она не описана явно как static. Первый ее параметр должен быть типа void* и можно добавлять второй параметр типа size_t. Она не может возвращать какое-либо значение и тип возвращаемого значения должен быть void, например:

class X {

 //…

 void operator delete(void*);

};

class Y {

 //…

 void operator delete(void*, size_t);

};

В каждом классе можно описать только одну функцию operator delete, значит эта функция не может быть перегруженной. Глобальная функция operator delete имеет единственный параметр типа void*.

Если функция описана с двумя формальными параметрами, она вызывается с двумя параметрами, второй из которых показывает размер удаляемого объекта. Передаваемый размер определяется с помощью деструктора (если он есть) или по типу (статическому) указателя на удаляемый объект. Операция пройдет корректно, если тип указателя, заданного как фактический параметр, будет совпадать с типом объекта (а не будет, к примеру, просто типом указателя на базовый класс) или, если этот тип является типом указателя на базовый класс с виртуальным деструктором.

  • Читать дальше
  • 1
  • ...
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: