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.


 

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

51560. Призначення і функції програми оболонки MS DOS Norton Commander. Запуск програми. Отримання допомоги. Вказівки для роботи з файлами та каталогами 2.34 MB
  У рядку міністатусу панелі що не є поточною виводиться інформація про той файл або підкаталог який стає виділеним після натискання на клавішу Tb. Щоб зробити поточною іншу панель слід натиснути на клавішу табуляції позначену Tb . Якщо натиснути і утримувати клавішу Сtrl то ви побачите що команди на рядочку статуса змінюються тобто їх стане ще десять а якщо натиснути і утримувати клавішу Аlt то ви спостерігатимете ще зміни тобто команд стане ще десять. ВИХІД З NС Для виходу з NС потрібно натиснути клавішу F10.
51561. Следствие ведут первоклашки или прощание с первым классом 73 KB
  Оборудование: Папки первоклассников портфолио Красочный конверт Цветиксемицветик с загадками Звёзды с задачами Красивый мешочек с песком Телеграмма для Бабы Яги Канат Табличка Лесная налоговая инспекция Счёты для Кощея Ларец со смертью Кощея в мягкую игрушку зайца зашить игрушку утку а неё зашить зубочистку Сейф Разрезанное на буквы слово КАНИКУЛЫ Школьный звонок Плакат Кафе Ура каникулы Угощение для детей Костюмы для персонажей Действующие лица: Василиса Прекрасная Звездочет Баба Яга...
51562. Турбота про здоров’я. Особиста гігієна 50 KB
  Виховати санітарну культуру прагнення зберегти своє здоровя. Формувати стійкі мотиваційні установки на здоровий спосіб життя. Хід виховного заходу Вступне слово вчителя: Зрозуміло всім відомо що приємно бути здоровим.
51563. Праздник «До свидания, 1-й класс! Здравствуй, лето! 133.86 KB
  Поспешите угадать Что в ней и откуда передает корзину учителю Дети да это же приходил сам дядя Степа. Кто из взрослых помнит продолжение этой любимой детской книжки многих поколений По фамилии Степанов И по имени Степан Из районных великанов Самый главный великан От ворот и до ворот знал в районе весь народ Где работает Степанов Где прописан где живет Потому что всех быстрее Без особенных трудов Он снимал ребятам змеев С телеграфных проводов. Но нам надо определить: что в корзине и откуда. Но я нечаянно перепутал...
51564. Методичні поради з розвитку мовленнєвих компетентностей учнів 1 класу 80 KB
  Недостатнє поверхове оволодіння основами рідної мови низька культура усного і писемного мовлення незадовільна читацька навичка і розуміння змісту прочитаного серйозно гальмують загальний розвиток дітей не дають їм змоги успішно вчитись засвоювати основи знань що дає школа. Тому у навчальних планах та програмах на чільне місце ставиться навчання рідної мови. Державний стандарт загальної початкової мовної освіти зорієнтовано на всі чотири види мовленнєвої діяльності на уроках української мови: аудіювання слухання і розуміння;...
51565. Откуда берутся шоколад и мед 60 KB
  Задачи: познакомить детей с производством хорошо известныхсладостей шоколад изюм мёд показать их природноепроисхождение. А вы хотите узнать откуда берется изюм мед шоколад. В первой баночке шоколад во второй изюм а в третьей мед.
51566. Обєми многогранників та тіл обертання 10.46 MB
  Спіймати на гарячому ювеліра Архімеду допоміг відкритий ним у ванні евристичний закон: обєм зануреного у воду тіла можна знайти по витісненому тілом обєму води див. щоб знайти обєм циліндра використовували метод апроксимації для обємів подібних тіл принцип Кавальєрі для зрізання формули Сімпсона; д. Додаткове питання вчитель Що необхідно щоб виміряти обєм геометричного тіла Знайти число яке визначає скільки одиничних кубів міститься у даному геометричному тілі. Знайти обєм повітря в кабінеті відповісти на питання:...