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.


 

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

43132. Веб-приложения на Java, реализующее функциональность просто интернет-магазина 953 KB
  Основные модели архитектуры JSP. Функционирование JSP. Заключение Список литературы Введение JSP JvServer Pges технология позволяющая веб-разработчикам легко создавать содержимое которое имеет как статические так и динамические компоненты.
43133. Поиск неисправностей в СВ 1.17 MB
  Анализ неисправности на структурном уровне По структурной схеме СВ устанавливаем вероятный неисправный блок. Согласно внешним признакам проявления неисправности очевидно что неисправен может быть либо сам ПОУ СВ либо блок ВчУ структурный уровень так как только эти устройства участвуют в записи информации с ПОУ СВ на ВчУ. Анализ неисправности на функциональном уровне По функциональной схеме устанавливаем вероятные неисправные устройства блока ПОУ СВ и ВчУ. Учитывая внешний признак проявления неисправности очевидно что этими устройствами...
43134. Проектирование привода ленточного транспортера 7.63 MB
  Расчет вала на выносливость Выбор муфты для выходного вала. Выбор муфты для ведомого вала. Редуктор имеет три вала: горизонтально расположенный ведущий быстроходный вал на котором установлена коническая шестерня и два горизонтальных вала перпендикулярных ведущему валу.
43135. Проектування корпуса фільтра вертикального однокамерного 1.3 MB
  Графічна частина виконується у обсязі двох аркушів формату А1: один аркуш складального креслення апарату загальний вигляд; один аркуш формату А2 зі складальним кресленням вузлів апарату за вказівкою викладача керівника проекту після виготовлення креслення першого аркуша; один аркуш формату А2 з робочими кресленнями деталей різноманітного призначення за вказівкою викладача керівника проекту після розробки складальних креслень формат А2 ділиться за необхідністю на декілька менших форматів. Розрахунковопояснювальна записка...
43137. Какова сущность, функции и структура морали 35.5 KB
  Всем известно, что человек — это индивид, умеющий себя ограничивать. Все мы живем в мире сплошных ограничений. Можно с уверенностью сказать, что человек и человеческое общество возникли тогда, когда научились себя ограничивать. Так, например первыми законами были законы, запрещающие браки между родственниками.
43138. Методика викладання теми “Основні поняття алгоритмізації” у 8 класах 2.21 MB
  У житті ми постійно складаємо опис деякої послідовності дій для досягнення бажаного результату, тому поняття алгоритму не є для нас чимось новим і незвичайним. Кожен із нас використовує сотні різних алгоритмів. Але рішення завдання на комп'ютері неможливо без створення алгоритму. Вміння виконувати завдання, розробляти стратегію її вирішення, висувати і доводити гіпотези досвідченим шляхом, прогнозувати результати своєї діяльності, аналізувати і знаходити раціональні способи вирішення завдання шляхом оптимізації, деталізації створеного алгоритму дозволяють судити про рівень розвитку алгоритмічного мислення школярів. Тому необхідно особливу увагу приділяти алгоритмічному мисленню підростаючого покоління.
43139. Програмування. Методичні вказівки 206 KB
  Тема першого завдання – використання візуальних компонентів із вкладок компонентів Stndrt System dditionl при роботі з масивами даних. Оброблений масив список даних вивести в таблицю MS Word створену за допомогою Delphi. Друге завдання – створення баз даних та обробка інформації з них. База даних створюється за допомогою утілити Dtbse Desktop або за допомогою інших програм створення баз даних наприклад MS ccess.
43140. Синтез автомата по заданому алгоритму роботи 1.49 MB
  Система з чотирьох перемикальніх функцій задана таблицею 2.1 – таблиця істиності заданих функцій Необхідно виконати сумісну мінімізацію функцій f1 f2 f3. Отримати операторні представлення для реалізації системи функцій на програмувальних логічних матрицях. 4 Етапи проектування і терміни їх виконання 1 Розмітка станів автомата 2 Формування вхідного та вихідного алфавітів 3 Побудова графа автомата 4 Побудова таблиці переходів 5 Побудова структурної таблиці автомата 6 Синтез комбинаційних схем для функцій збудження тригерів і вихідних...