Выбрать главу

  void *operator new[](size_t size);

  void operator delete(void *p);

  void operator delete[](void *p);

  void show();

};

// Перегрузка оператора new для класса three_d.

void *three_d::operator new(size_t size)

{

 void *p;

 cout <<"Выделение памяти для объекта класса three_d.\n";

 р = malloc(size);

 // Генерирование исключения в случае неудачного выделения памяти.

 if(!р) {

  bad_alloc ba;

  throw ba;

 }

 return р;

}

// Перегрузка оператора new для массива объектов типа three_d.

void *three_d::operator new[](size_t size)

{

 void *p;

 cout <<"Выделение памяти для массива three_d-oбъeктoв.";

 cout << "\n";

 // Генерирование исключения при неудаче.

 р = malloc(size);

 if(!р) {

  bad_alloc ba;

  throw ba;

 }

 return p;

}

// Перегрузка оператора delete для класса three_d.

void three_d::operator delete(void *p)

{

 cout << "Удаление объекта класса three_d.\n";

 free(p);

}

// Перегрузка оператора delete для массива объектов типа three_d.

void three_d::operator delete[](void *p)

{

 cout << "Удаление массива объектов типа three_d.\n";

 free(р);

}

// Отображение координат X, Y, Z.

void three_d::show()

{

 cout << x << ", ";

 cout << у << ", ";

 cout << z << "\n";

}

int main()

{

 three_d *p1, *p2;

 try {

  p1 = new three_d[3]; // выделение памяти для массива

  р2 = new three_d(5, 6, 7); // выделение памяти для объекта

 }

 catch (bad_alloc ba) {

  cout << "Ошибка при выделении памяти.\n";

  return 1;

 }

 p1[1].show();

 p2->show();

 delete [] p1; // удаление массива

 delete р2; // удаление объекта

 return 0;

}

При выполнении эта программа генерирует такие результаты.

Выделение памяти для массива three_d-oбъeктoв.

Создание объекта 0, 0, 0

Создание объекта 0, 0, 0

Создание объекта 0, 0, 0

Выделение памяти для объекта класса three_d.

Создание объекта 5, 6, 7

0, 0, 0

5, б, 7

Разрушение объекта

Разрушение объекта

Разрушение объекта

Удаление массива объектов типа three_d.

Разрушение объекта

Удаление объекта класса three_d.

Первые три сообщения Создание объекта 0, 0, 0 выданы конструктором класса three_d (который не имеет параметров) при выделении памяти для трехэлементного массива. Как упоминалось выше, при выделении памяти для массива автоматически вызывается конструктор каждого элемента. Сообщение Создание объекта 5, б, 7 выдано конструктором класса three_d (который принимает три аргумента) при выделении памяти для одного объекта. Первые три сообщения Разрушение объекта выданы деструктором в результате удаления трехэлементного массива, поскольку при этом автоматически вызывался деструктор каждого элемента массива. Последнее сообщение Разрушение объекта выдано при удалении одного объекта класса three_d. Важно понимать, что, если операторы new и delete перегружены для конкретного класса, то в результате их использования для данных других типов будут задействованы оригинальные версии операторов new и delete. Это означает, что при добавлении в функцию main() следующей строки будет выполнена стандартная версия оператора new.