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.


 

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

26033. Права и обязанности гражданского служащего 55 KB
  № 79ФЗ О государственной гражданской службе Российской Федерации иными нормативными правовыми актами РФ и условиями служебного контракта; получение в установленном порядке информации и материалов необходимых для исполнения должностных обязанностей а также на внесение предложений о совершенствовании деятельности государственного органа; доступ в установленном порядке к сведениям составляющим государственную тайну необходимым для исполнения должностных обязанностей; доступ в установленном порядке в связи с исполнением должностных...
26034. Запреты и ограничения, связанные с государственной гражданской службой. Общие принципы служебного поведения государственных служащих 72.5 KB
  2004 № 79ФЗ О государственной гражданской службе Российской Федерации. Порядок прохождения диспансеризации перечень таких заболеваний и форма заключения медицинского учреждения устанавливаются уполномоченным Правительством Российской Федерации федеральным органом исполнительной власти; 5 близкого родства или свойства родители супруги дети братья сестры а также братья сестры родители и дети супругов с гражданским служащим если замещение должности гражданской службы связано с непосредственной подчиненностью ...
26035. Понятие и признаки государственной службы 46.5 KB
  Противодействие коррупции на государственной и муниципальной службе.2008 О противодействии коррупции под коррупцией понимается злоупотребление служебным положением дача взятки получение взятки злоупотребление полномочиями коммерческий подкуп либо иное незаконное использование физическим лицом своего должностного положения вопреки законным интересам общества и государства в целях получения выгоды в виде денег ценностей иного имущества или услуг имущественного характера иных имущественных прав для себя или для третьих лиц либо...
26036. Виды государственной службы 62.5 KB
  Военная служба и правоохранительная служба являются видами федеральной государственной службы. Путем внесения изменений и дополнений в Федеральный закон О системе государственной службы Российской Федерации могут быть установлены и другие виды федеральной государственной службы. правовое регулирование и организация федеральной государственной службы находятся в ведении Российской Федерации п.
26037. Принципы государственной службы 33.5 KB
  Основные принципы построения и функционирования системы государственной службы 1. Основными принципами построения и функционирования системы государственной службы являются: федерализм обеспечивающий единство системы государственной службы и соблюдение конституционного разграничения предметов ведения и полномочий между федеральными органами государственной власти и органами государственной власти субъектов Российской Федерации далее государственные органы; законность; приоритет прав и свобод человека и гражданина их непосредственное...
26038. Особенности замещение государственных должностей 43.5 KB
  Особенности замещение государственных должностей По действующему законодательству государственные должности государственной службы замещаются путем назначения. Правом на замещение вакантной должности гражданской службы обладают гражданские служащие граждане которые соответствую установленным законодательством Российской Федерации о государственной гражданской службе квалификационным требованиям к вакантной должности. К числу квалификационных требований относятся: требования к стажу государственной службы или стажу работы по специальности...
26039. Цели и задачи реформирования и развития системы государственной службы 50.5 KB
  Цели и задачи реформирования и развития системы государственной службы. Основные цели и задачи реформирования системы государственной службы Российской Федерации были сформулированы в Концепции реформирования системы государственной службы Российской Федерации утвержденной Президентом РФ 15 августа 2001 году. В соответствии с Концепцией созданы основы единой системы гос. В процессе реформирования гос.
26040. Общая структура триггеров 13.24 KB
  Информационные сигналы поступают на входы A и В ЛУ и преобразуются в сигналы поступающие на внутренние входы S и R ЯП. Управляющие сигналы на асинхронный триггер воздействуют непосредственно с началом своего появления на их входах а в синхронных только с приходом сигнала на входе C.
26041. Простые триггеры 20.11 KB
  Схема простейшего триггера построенного на инверторах В этой схеме может быть только два состояния на выходе Q присутствует логическая единица и на выходе Q присутствует логический ноль. Если логическая единица присутствует на выходе Q то на инверсном выходе будет присутствовать логический ноль который после очередного инвертирования подтверждает уровень логической единицы на выходе Q. И наоборот если на выходе Q присутствует логический ноль то на инверсном выходе будет присутствовать логическая единица.