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.


 

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

30716. Развитие социально-политического кризиса в Европе в начале 1920-х гг 22 KB
  : сильный рост промышленного правительства в США Франции в результате 1 мировой войны они обогатились. Основой промышленного подъема был технический прогресс новые технологии новые отрасли автомобили Увеличение концентрации и централизации капитала усиления мощи корпораций смена промышленности и банков рост финансового капитала. Рост благотворительности для поддержания социальной стабильности.
30717. ФРГ: переход к новой «восточной политике». Договор с СССР от 12 августа 1970 г 27 KB
  Брандт с 1969 канцлер ФРГ лидер социалдемократов. Подтверждалось что Западный Берлин не является частью территории ФРГ и устанавливался тройной механизм взаимоотношений между компетентными органами ГДР Западного Берлина и ФРГ по вопросам регулирования транзитных перемещений граждан транспортного телефонного и телеграфного сообщения и пр. Но Западный Берлин имел международные соглашения заключенные ФРГ поэтому ФРГ получила право представлять интересы жителей Западного Берлина в международных организациях по вопросам не...
30718. Причины, особенности и основные последствия мирового экономического кризиса 1929 – 1933 гг 23 KB
  Мировой экономический кризис 19291933 годов носивший название Великой депрессии наиболее сильно затронул такие страны как Великобритания США Франция Канада и Германия. Важным фактором обусловившим всемирный характер великой депрессии стал процесс перемещения экономического центра из Западной Европы в США. Последствиями Великой депрессии стали: ухудшение уровня жизни фермеров и мелких торговцев; уменьшение уровня производства; рост числа безработных; возрастание сторонников фашистских организаций.
30719. Исторический опыт Народных фронтов (Франция, Испания, Чили) 23.5 KB
  Народный фронт представляет собой политический союз который как правило объединяет левые и центральные силы для осуществления противодействия правым силам представителей власти. Основной целью возникновения народных фронтов стала борьба за защиту экономических интересов рабочего класса и противопоставление войне и фашизму. Самый первый народный фронт был образован во Франции в 1935 году который объединил в себе все левосторонние партии.
30720. Общее и особенное в политике британских консерваторов и лейбористов в 1920-е гг 23 KB
  Консервативная партия Великобритании одна из двух ведущих политических партий страны образовавшаяся в 1867 году на базе партии тори. К 1930му году в Великобритании стала ясной гибель радикального социализма тогда на первый план выдвинулся либерализм который настаивал на прямом вмешательстве государства в экономику и передаче государству целого ряда социальных функций. Внутреннюю политику консерваторов Великобритании 1920 1930х годов можно охарактеризовать как стремление сохранить существующую ранее универсальность и...
30721. Основные этапы первой мировой войны. Факторы поражения германо-австрийского блока 27.5 KB
  В июле 1914 г Германия и Австровенгрия начинают первую мировую войну. Германия хотела сначала вывести из строя Францию чтобы прекратить борьбу на два фронта: Западном и Восточном. 1 этап вторжение в Бельгию где Германия потерпела поражение: в Восточной Пруссии Германия воевала с русскими армиями; в Галиции и Польше где победы достались русским. Германия и АвстроВенгрия были экономически истощены под влиянием революций в России среди военных германии и Австрии усилилась антивоенная агитация народ устал от...
30722. «Новый курс» Результата и его историческое значение 24.5 KB
  Его основная цель состояла в оздоровлении экономики и восстановления доверия граждан к государству. Политика Рузвельта получила название Новый курс который он восстановил государственное регулирование экономики и социальных отношений. Законом об оздоровлении национальной экономики вся промышленность была разделена на 17 групп по отраслям и регулировалась нормативными актами кодексами чести определявшими объем выпуска товаров уровня заработной платы распределение рынков сбыта продолжительность рабочего времени и др....
30723. Эволюция и крах бюрократических режимов в стране ЦЮВЕ 26.5 KB
  было сформировано коалиционное правительство в ГДР. Чехословакия и ГДР несколько условно могут быть отнесены к государствам с довольно высоким уровнем развития Польша Венгрия Хорватия и Словения страны среднего развития а Болгария Румыния четыре другие республики бывшей Югославии Сербия Черногория Македония Босния и Герцеговина Албания низкого. По решению парламентов ГДР и ФРГ с 1 июля 1990 г. ГДР прекратила свое существование вместо нее появились пять новых федеральных земель ФРГ.
30724. Изоляционизм США термин использовавшийся с середины 19 в. 25 KB
  Изоляционизм США термин использовавшийся с середины 19 в. для обозначения направления во внешней политике США в основе которого лежит идея невмешательства в европейские дела и вообще в вооруженные конфликты вне американского континента. складывались под влиянием ряда факторов: географическая обособленность Американского континента создание в США ёмкого внутреннего рынка способствовавшего тому что значительная часть буржуазии мало интересовалась заокеанской экспансией расширение за счет др.