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.


 

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

77019. Понятие и предмет административного права. Общественные отношения, регулируемые административным правом 24.55 KB
  Виды управленческих отношений регулируемых нормами административного права: По субъектному признаку: между соподчиненными субъектами государственного управления вертикальные отношения; между субъектами исполнительной власти не находящимися в состоянии соподчинения горизонтальные отношения; между субъектами исполнительной власти и исполнительными органами местного самоуправления; между субъектами исполнительной власти и общественными объединениями; между субъектами исполнительной власти и государственными служащими; между...
77020. Система и принципы административного права как отрасли российского права 29.07 KB
  Система и принципы административного права как отрасли российского права. Система отрасли административного права включающая в себя две основных подсистемы Общей и Особенной части которые в свою очередь можно подразделить и на меньшие подсистемы. Общая часть включает: 1 управление государственное управление исполнительные органы власти; 2 административное право как отрасль права научная отрасль знаний и учебная дисциплина; 3 субъекты административного права; 4 формы и методы осуществления деятельности органов исполнительной власти...
77021. Методы административного права 33.31 KB
  Метод административноправового регулирования это совокупность практических приемов способов и средств воздействия на общественные отношения составляющие предмет административно правового регулирования. Метод административноправового регулирования определяет: правовое положение сторон приемы и способы при помощи которых субъекты реализуют свои права и обязанности способы защиты сторонами своих прав судадм.порядок как возникают изменяются и прекращаются правоотношения защиты своих прав Признаки метода...
77022. Соотношение административного права со смежными отраслями российского права 27.14 KB
  Соотношение административного права со смежными отраслями российского права. Сущность административного права: является публичным правом призванным обеспечить публичный интерес регулируя отношения связанные с управлением общественными процессами; нормы административного права обеспечивают интересы общества государства коллективов права и интересы граждан и т. Взаимодействие с конституционным правом: конституционное право устанавливает исходные положения для всех отраслей права в том числе административного. На основании норм...
77023. Административное право как наука и учебная дисциплина 22.96 KB
  Предметом науки административного права является исследование законов закономерностей и особенностей в управленческой деятельности органов исполнительной власти органов государственного управления администраций органов МСУ их должностных лиц и осуществляемых при этом управленческих отношений в иных сферах эффективности административноправовых норм регулирующих эти отношения правоприменительной практики выявление свойств с целью их совершенствования. Дисциплина курса Административное право представляет собой систему которая...
77024. Понятие системы административно-правового регулирования 29.33 KB
  Понятие системы административно-правового регулирования. Система элементов механизма административно-правового регулирования представляет собой совокупность элементов и правовых средств взаимосвязанных и взаимозависимых и образуемых в информационно-правовое единство в целях упорядочивающего воздействия и устойчивого развития управленческих отношений в сфере деятельности органов исполнительной власти государственного управления администраций органов МСУ уполномоченных должностных лиц и иных регулируемых административными правовыми нормами...
77025. Нормы административного права: понятие, особенности, структура, виды и их характеристика 29.53 KB
  Нормы административного права: понятие особенности структура виды и их характеристика. Административно-правовая норма это мера должного или возможного допускаемого рекомендуемого поведения людей установленная государством и охраняемая специальными средствами...
77026. Реализация и действие административно-правовых норм 27.75 KB
  Реализация административно-правовых норм выражается в практическом проведении в жизнь содержащихся в них правовых предписаний и обеспечении должного поведения участников управленческих отношений.
77027. Административно-правовые отношения: понятие, особенности, содержание. Основания возникновения, изменения и прекращения этих отношений 30.05 KB
  Виды административно-правовых отношений. Административно-правовые отношения это общественные отношения урегулированные нормами административного права возникающие в сфере исполнительной власти государственного управления. Признаки административных правоотношений: являются публичными правоотношениями имеющими в своей основе общественный государственный интерес; носят властный характер так как в процессе возникновения изменения и прекращения данных правоотношений реализуется государственное управление; являются организационными...