68949

Перевантаження операторів new і delete

Лекция

Информатика, кибернетика и программирование

У мові C++ можна перенавантажувати операторів new і delete. Це доводиться робити, якщо виникає необхідність створити особливий механізм розподілу пам’яті. Наприклад, можна зажадати, щоб процедура розподілу пам’яті використовувала жорсткий диск як віртуальну пам’ять, якщо купа вичерпана.

Украинкский

2014-09-27

53.5 KB

2 чел.

Лекція № 11

Тема: Перевантаження операторів new і delete

План

  1.  Перевантаження оператора new
  2.  Перевантаження оператора delete
  3.  Глобальне перевантаження операторів new та delete

Перевантаження оператора new

У мові C++ можна перенавантажувати операторів new і delete. Це доводиться робити, якщо виникає необхідність створити особливий механізм розподілу пам'яті. Наприклад, можна зажадати, щоб процедура розподілу пам'яті використовувала жорсткий диск як віртуальну пам'ять, якщо купа вичерпана. Перевантаження операторів new і delete здійснюється дуже просто.

Розглянемо схематичний пристрій функцій, що перенавантажують операторів new і delete.

// Виділення пам'яті для об'єкту

void *operator new(size_t size)

{

/* Виділяється пам'ять. У разі невдачі генерується

виняткова ситуація bad_alloc.

Конструктор викликається автоматично. */

return pointer_to_memory;

}

 

// Видалення об'єкту.

void operator delete(void *p)

{

/*  Звільняється пам'ять   

на яку посилається покажчик р.

Деструкція викликається автоматично.   */

}

Розмір типу size_t відповідає одиниці пам'яті, що виділяється. (Як правило, тип size_t визначається як тип unsigned int.) Параметр size задає кількість байтів, необхідних для зберігання об'єкту, що розміщується в пам'яті. Перевантажена функція new повинна повертати покажчик на виділену область пам'яті або генерувати виняткову ситуацію bad_alloc. У всьому останньому функція new може бути абсолютне довільною. При виділенні пам'яті за допомогою оператора new (як стандартного, так і перевантаженого) автоматично викликається конструктор об'єкту.

Перевантаження оператора delete

Оператора delete отримує покажчик на область пам'яті, що звільняється, і повертає її операційній системі. Для знищення об'єкту автоматично викликається деструкція.

Для того, щоб операторів new і delete можна було викликати в будь-яких місцях програми, їх слід перенавантажувати глобально. Крім того, їх можна перенавантажувати лише для окремих класів. Розглянемо перевантаження операторів new і delete для конкретного класу. Для простоти припускатимемо, що пам'ять виділяється як завжди, тобто за допомогою стандартних функцій malloc () і calloc (). (Зрозуміло, ви можете реалізувати свої власні схеми розподілу пам'яті.)

Для перевантаження операторів new і delete в класі слід визначити перевантажені операторні функції-члени. Наприклад, в наступній програмі оператори new і delete перевантажуються для класу 1ос.

#include <iostream>

#include «ccstdlifc»

#include <new>

using namespace std;

class loc {

int longitude, latitude;

public:

loc() {

loc(int lg, int It) { longitude = lg; latitude = It; }

void show() {

cout << longitude « " "; cout « latitude « "\n";

}

void *operator new(size_t size); void operator delete(void *p);

};

// Оператор new, перевантажений для оператора loc.

void *loc::operator new(size_t size)

{

void *p;

cout « "Усередині перевантаженого оператора new.\n";

p = malloc(size);

 if(!p){

bad_alloc ba;

throw ba;

}

return p;

}

// Оператор delete, перевантажений для класу loc.

void loc::operator delete(void *p)

{

cout « "Усередині перевантаженого оператора delete.\n";

free(p);

}

int main() {

loc *pl, *p2;

try {

pi = new loc (10, 20);

} catch (bad_alloc ха) {

cout « "Помилка при виділенні пам'яті для об'єкту pl.\n";

return 1;

}

try {

р2 = new loc (-10, -20);

} catch (bad_alloc ха) {

cout « "Помилка при виділенні пам'яті для об'єкту р2.\ п";

return 1;

}

p1->show(); p2->show();

delete p1; delete p2;

return 0;

}

 

Якщо оператори new і delete перевантажуються для конкретного класу, то їх застосування до інших класів означатиме виклик стандартних операторів new і delete. Перевантажені оператори застосовуються тільки до тих типів, для яких вони визначені. Це означає, що в наступному рядку програми буде виконаний стандартний оператор new.

int  *f = new float; //Выполняется стандартний оператор new

Глобальне перевантаження операторів new та delete

Якщо операторів new і delete перенавантажувати поза класами, вони вважатимуться глобальними. В цьому випадку стандартні оператори new і delete ігноруються.

Зрозуміло, якщо якісь класи містять свої версії цих операторів, то будуть виконані саме вони. Інакше кажучи, у кожному конкретному випадку компілятор сам аналізує, який варіант оператора new або delete слід виконати. Якщо виявляється перевантажений варіант оператора, визначений для конкретного класу, то викликається саме ця версія, інакше застосовується глобальний оператор. Якщо глобальний оператор перевантажений, виконуються його перевантажені версії.

Розглянемо приклад, в якому оператори new і delete перевантажені глобально.

#include <iostream>

#include <cstdlib>

#include <new>

using namespace std;

class loc {

int longitude, latitude;

public:

loc() {

loc(int lg, int It) { longitude = lg; latitude = It; }

void show() {

cout « longitude « " "; cout « latitude « "\n";

}

};

// Глобальний оператор new

void *operator new(size_t size){

void *p;

p = malloc(size);

if(!p){

bad_alloc ba;

throw ba;

}

return p;

 

// Глобальний оператор delete

void operator delete(void *p){

free(p);

}

int main() {

loc *pl, *p2;

float *f;

try {

pi = new loc (10, 20) ;

} catch (bad_alloc ха) {

cout << "Помилка при виділенні пам'яті для об'єкту pl.\n";

return 1;

}

try {

p2 = new loc (-10, -20);

} catch (bad_alloc ха) {

cout « " Помилка при виділенні пам'яті для об'єкту р2.\ п";

return 1;

}

try {

f = new float; // Іпользуєтся перевантажена версія

// оператора new

} catch (bad_alloc ха) {

cout << " Помилка при виділенні пам'яті для об'єкту f.\n";

return 1;

}

* f = 10.10F;

cout « *f « "\n";

pl->show(); p2->show() ;

delete p1; delete p2; delete f;

return 0;

}

 

Запустіть цю програму і переконаєтеся, що для вбудованих типів дійсно викликаються перевантажені оператори new і delete.


 

А также другие работы, которые могут Вас заинтересовать

30375. Методическое обеспечение САПР. Математический и лингвистический виды обеспечений 167.5 KB
  Лекция: Методическое обеспечение САПР. Математический и лингвистический виды обеспечений Рассматривается состав методического обеспечения САПР его сущность состав. Приводятся его компоненты методический и лингвистический виды обеспечения САПР для случая когда последний не является самостоятельным. Изучение одного из важнейших видов обеспечения САПР методического обеспечения 8.
30376. Программное обеспечение САПР 111.5 KB
  Лекция: Программное обеспечение САПР Рассматривается сущность программного обеспечения систем автоматизированного проектирования ПО САПР документы в составе ПО САПР. Даются структура общесистемного ПО и основные характеристики прикладного ПО САПР. Основное назначение лекции усвоение сущности программного обеспечения САПР ПО САПР его функций состава а также роли операционных систем ОС 9. Программное обеспечение САПР.
30377. Информационное обеспечение САПР 220.5 KB
  Рассмотрены принципы построения базы данных и способы согласования программ при формировании базы данных. Назначение сущность и составные части информационного обеспечения ИО САПР Основное назначение ИО САПР уменьшение объемов информации требуемой в процессе проектирования от разработчика РЭС и исключение дублирования данных в прикладном программном и техническом обеспечении САПР [7 51]. ИО САПР состоит из описания стандартных проектных процедур типовых проектных решений типовых элементов РЭС комплектующих изделий и их моделей...
30378. Информационное обеспечение САПР. Реляционная модель баз данных 320 KB
  Лекция: Информационное обеспечение САПР окончание Рассматриваются реляционная сетевая и иерархическая модели баз данных о которых в общем излагалось в предыдущей лекции. Реляционная модель баз данных Реляционная база данных разработанная Э. Тем самым теория реляционных баз данных становится областью приложения математической логики и современной алгебры и опирается на точный математический формализм. В реляционных базах данных основные операции включение удаление модификация и запрос данных применяются к кортежам и доменам.
30379. Методы автоматизированного проектирования конструкции и технологического процесса различного уровня иерархии 136 KB
  В САПР для каждого иерархического уровня сформулированы основные положения математического моделирования выбран и развит соответствующий математический аппарат получены типовые ММ элементов проектируемых объектов формализованы методы получения и анализа математических моделей систем. Это обстоятельство приводит к расширению множества используемых моделей и развитию алгоритмов адаптивного моделирования. В САПР для каждого иерархического уровня сформулированы основные положения математического моделирования выбран и развит соответствующий...
30380. Математические модели (ММ) на различных иерархических уровнях 327.5 KB
  Лекция: Математические модели ММ на различных иерархических уровнях Приводится иерархия математических моделей как основа блочноиерархического подхода к проектированию радиоэлектронных средств. Рассмотрим важные для функциональных моделей понятия полной модели и макромодели. При переходе к более высокому иерархическому уровню упрощения они основаны на исключении из модели вектора внутренних переменных V. Модели 13.
30381. Математические модели объектов проектирования РЭС 367 KB
  Лекция: Математические модели объектов проектирования РЭС Рассматривается методология использования математических моделей при проектировании конструкции и технологии РЭС. Цель лекции:Показать на конкретных примерах математические модели при проектировании РЭС 14. В общей теории математического моделирования математическую модель любого объекта характеризуют внутренними внешними выходными параметрами и фазовыми переменными. Внутренние параметры модели определяются характеристиками компонентов входящих в проектируемый объект например...
30382. Разработка математических моделей при проектировании технологии 164 KB
  Методы получения моделей элементов Получение моделей элементов моделирование элементов в общем случае процедура неформализованная. В то же время такие операции как расчет численных значений параметров модели определение областей адекватности и др. Поэтому моделирование элементов обычно выполняется специалистами конкретных технических областей с помощью традиционных средств экспериментальных исследований и средств САПР. Далее происходит определение соответствующего этим закономерностям математического описания обоснование и принятие...
30383. Математические модели РЭС на метауровне 159.5 KB
  При моделировании на ЭВМ технологического процесса происходит воспроизведение явлений с сохранением их логической структуры и расположения во времени. Это позволяет получать наиболее точные характеристики процесса проектирования техническую производительность время проведения отдельных технологических операций и т. Цель моделирования технологического процесса заключается в проектном расчете технической производительности и других показателей экономической эффективности с учетом заданного варианта структуры каждой операции технологического...