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.


 

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

42417. Бинарные отношения. Симметричные отношения 141.5 KB
  Определение 6: Отношение  на множестве Х называется рефлексивным если для любого элемента хХ выполняется хх. Определение 7: Отношение  на множестве Х называется симметричным если для любых хуХ из ху следует ух. Определение 8: Отношение  на множестве Х называется транзитивным если для любых хуzХ из ху yz следует xz. Определение 9: Отношение  на множестве Х называется антисимметричным если для любых xy X из xy и yx следует x=y.
42418. Функции. Принцип Дирихле 46 KB
  Докажите что либо одно из них делится на 5 либо сумма нескольких рядом стоящих чисел делится на 5. Докажите что какието три из них можно накрыть квадратиком со стороной 02 м. Докажите что найдутся как минимум 2 ученика отмечающих дни рождения в один месяц. Докажите что расстояние между некоторыми двумя из них меньше 05 см.
42419. Комбинаторика. Основные комбинаторные принципы и соединения 198.5 KB
  Введем некоторые важные обозначения: множества будем обозначать заглавными буквами; множества состоят из элементов которые будем обозначать малыми буквами. Такие множества будем изображать перечислением элементов заключая их в фигурные скобки. 3 Количество элементов в множестве называется мощностью и записывается как . Комбинаторные соединения Некоторая совокупность элементов данного nмножества называется выборкой.
42420. Булева алгебра. Законы логики высказываний. Эквивалентные преобразования 83 KB
  Законы логики высказываний. Теоретическая часть Всё множество формул логики высказываний с точки зрения их значения истинности разбивается на три класса: 1 тождественно истинные тавтология; 2 тождественно ложные противоречие; 3 нейтральные. Особое место в логике высказываний занимают законы логики тождественно истинные формулы тавтологии. Законы логики высказываний Закон тождества: А эквивалентно А.
42421. Равносильность формул. Закон двойственности. Логические функции 120.5 KB
  Каждая формула представляет собой функцию входящих в нее букв А В Определение1: Формулы F1 и F2 называются равносильными если при любых значениях входящих в них переменных x1x2xn эти формулы принимают одинаковые значения. Между понятиями равносильности и эквивалентности существует связь: если формулы F1 и F2 равносильны то формула F1F2 эквивалентность принимает одни и те же значения при всех значениях переменных и обратно: если формула F1F2 принимает одни и те же значения при всех значениях переменных то формулы F1 и F2...
42422. Нормальные формы формул. Проблема разрешения 89 KB
  Теорема 1 о приведении к ДНФ: Для любой формулы А можно найти такую формулу В находящуюся в ДНФ что АВ. Формула В называется ДНФ формулы А. Конечно например все ДНФ данной формулы равносильны. Выделим среди ДНФ так называемую совершенную дизъюнктивную нормальную форму формулы.
42423. Полные системы булевых функций. Многочлен Жегалкина. Теорема Поста 60 KB
  Цель работы: овладение навыками представления булевых функций в виде полинома Жегалкина. Теоретическая часть Таблицы истинности булевых функций сростом числа аргументов становятся громоздкими и неудобными. Более удобный аналитический способ задания булевых функций основан на рассмотрении двузначной алгебры Поста с операцией суперпозиции над множеством булевых функций.
42424. Минимизация булевых функций методом Квайна 686 KB
  Теоретическая часть Рассмотренные выше совершенная дизъюнктивная и конъюнктивная нормальные формы СДНФ и СКНФ используются для первоначального представления заданной переключательной функции через функции основной системы. Но эти формы не удобны для построения логических схем ЭВМ так как часто содержат элементы которые можно исключить при синтезе схем исходя из других форм представления функции. Существует ряд эффективных способов нахождения минимальной ДНФ булевой функции. Применяемая в методе Квайна операция неполного склеивания...
42425. Функциональные схемы 435 KB
  Такие схемы встречаются в электронных устройствах используемых в компьютерах калькуляторах телефонных системах и ряде других устройств. Постановка задачи синтеза логических схем По аналогии с тем как из трех элементарных частиц  протонов нейтронов и электронов порождаются различные химические элементы которые соединяясь в молекулы образуют вещества всей живой и неживой природы из трех простейших логических схем  дизъюнктора конъюнктора и инвертора можно образовать сколь угодно сложные функциональные схемы соответствующие...