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.


 

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

52853. Збереження електроенергії у побуті 49 KB
  Мета: Поширити уявлення дітей про способи добування електроенергії. В домі дід мороз живе І продукти зберігає А щоб свіжими були Зіпсуватись не могли Їх у холоді тримає Холодильник Коментарі вчителя щодо збереження електроенергії. Своєчасно розморожувати щоб менше споживав електроенергії.
52854. Енергозбереження - працюємо разом 115.5 KB
  Мета: Навчати оцінювати запаси енергетичних ресурсів формувати переконаність у можливості раціонального використання природних ресурсів; навчати оцінювати побутові втрати енергії; підвести до висновку про можливість раціонального використання енергії; переконати учнів у необхідності пошуків засобів збереження енергії. Наші споживання в електроенергії змінюються в часі : доба тиждень рік. Доба Наші споживання в енергії змінюються на протязі доби частково від того в яких умовах ми живемо і частково від нашої роботи мал.1 З малюнок 1...
52855. Енергозбереження – почнемо з себе 83.5 KB
  Розширення індивідуального екологічного простору розвиток емпатії до природних об'єктів; Форма заняття: заняття студії Заняття розраховане на учнів 910 класу Обладнання: таблиці з зображенням будови атмосфери компютер підключений до мережі Інтернет свічка лампа розжарювання лампа енергозберігаюча лампа 20 21 Вт; лампа розжарювання 100 Вт; настільна лампа зі стандартним цоколем; кімнатний термометр; годинник кольорові стікери з зображенням пір року. Мета етапу сфокусувати увагу учнів на проблемі й викликати інтерес до...
52856. Енергосистема України. Споживання електроенергії. Енергозбереження 158 KB
  Споживання електроенергії. Мета: показати утворення енергосистеми України поєднання великих електростанцій і ліній електропередач; формувати вміння і навички встановлення відповідності у секторних діаграмах на основі аналізу статистичної інформації розширювати уміння усвідомлення власної значущості та можливості впливати на загальну енергозалежність країни; сформувати вміння аналізувати зміни частки різних видів електростанцій у загальному обсязі виробництва електроенергії в Україні. Символічним є те...
52857. Вулиця, на якiй я живу 30 KB
  My name is Semen. I live with my family in a big town. I live in Rivna street. My street is long. There are many green trees and flowers in our street. You can see many big houses and new shops in our street. My school is in our street too. In Rivna street you can always see many trams,buses and cars. In our street there are many men,women and children. My street is clean and nice. I like it very much
52858. About myself. My Biographical time-line 48 KB
  Мета уроку:систематизація пройденого лексико–граматичного матеріалу; формування комунікативних навичок усного мовлення; формування навичок аудіювання через прослуховування тексту з метою виділення ключової інформації; - biography to be born ballet primary school secondary school university to cheer to clap
52859. Освіта в Англії 192 KB
  Great Britain does not have a written constitution, so there are no constitutional provisions for education. The system of education is determined by the National Education Acts. It has many different faces, but one goal. Its aim is to realize the potential of all, for the good of the individual and the country. It embraces two educational purposes: first it gives a general education to all children, and second, it selects the most able and gives them more advanced education.
52861. What do you do? 47.5 KB
  James is lazy. He doesn’t like going to school. He has a quick shower every morning. He puts on his clothes, watches a cartoon. He never does his morning exercises to the radio. He eats bread and honey for breakfast. He has tea or coffee with a bar of chocolate. He never cleans his teeth. He catches the bus to school. He arrives at school late.