Black and White

Подобни документи
Обработка на грешки Изключения Любомир Чорбаджиев Технологическо училище Електронни системи Технически университет, София Re

Динамична памет. Конструктори и деструктори Любомир Чорбаджиев Технологическо училище Електронни системи Технически университет, София

Дефиниране на шаблон Шаблони (Templates) Любомир Чорбаджиев Технологическо училище Електронни системи Технически университет, София

Предефиниране на оператори. Копиращ конструктор. Оператор за присвояване Любомир Чорбаджиев Технологическо училище Електронни системи Технически униве

Сериализация Калин Георгиев 13 май 2016 г. Калин Георгиев Обектно ориентирано програмиране 13 май 2016 г. 1 / 23

Виртуални функции

Lush Green

Динамична памет Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 21 декември 2016 г. Тр

Указатели. Маисиви, указатели, параметри на функции Калин Георгиев 21 декември 2016 г. Калин Георгиев Увод в програмирането 21 декември 2016 г. 1 / 23

Структура на програма в C - Част 9 - низове от символи, C-string

Lush Green

2. Наследяване в C++ Съдържание Съдържание Наследяване (Rev: 1.2) Любомир Чорбаджиев 1 1 февруари 2007 г. 1 Наследяване 1 2

4

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA JAVA ОБЕКТИ Ненко Табаков Пламен Танов Технологическо училище Електронни системи Технически университет София 9 октомври

Класове в C++ (Rev: 742) Любомир Чорбаджиев 1 20 октомври 2006 г. Съдържание Съдържание 1 Обектно-ориентирано програмиране 1

2. Лексически анализ. Основни понятия и алгоритъм на лексическия анализ. Програмна структура на лексическия анализатор Цел на упражнението Упражнениет

Програмен език C Пламен Танов Ненко Табаков Мартин Вачовски Технологично училище Електронни системи Технически университет София версия 0.5

-

Програмиране на Паскал

C++

Структура на програма в C - Част 2 - типове, функции

Входно/изходните операции са разширяеми. Лесно се реализират входно/изходни операции за типове, дефинирани от потребителя. Потоци (Rev: 1.1) Любомир Ч

Канонична форма на клас или 4 (голямата четворка) Трифон Трифонов Обектно-ориентирано програмиране, спец. Компютърни науки, 1 поток, спец. Софтуерно и

Eclipse TUES 1 Кирил TUES

Проф

Title Tues 1 Кирил TUES

Структура на програма в C - Част 7 - масиви, оператор за индексиране, sizeof оператор

Потоци (Rev: 1.1)

OpenGL

3. Синтактичен анализ. Граматика на учебен програмен език STUDENT. Извеждане на изречения от правилата на граматиката Цел на упражнението Упражнението

При изпълнението на програма се извършват определени действия над данните, дефинирани в програмата.тези данни могат да бъдат постоянни ( константи ) и

MSDOS1

Маисви

Анализ и оптимизация на софтуерни приложения

Синтаксис за дефиниране на функции Трифон Трифонов Функционално програмиране, спец. Информатика, 2015/16 г. 6 януари 2016 г. Трифон Трифонов (ФП-И 15/

НАУЧНИ ТРУДОВЕ НА РУСЕНСКИЯ УНИВЕРСИТЕТ , том 54, серия 3.2 Реализация на вградения механизъм за извод в междинната форма на SPIDER/CNP програма

Масиви и низове Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 9 ноември 2016 г. Триф

ЦЕНТЪР ПО ИНФОРМАТИКА И ТЕХНИЧЕСКИ НАУКИ УЧЕБНА ПРОГРАМА Утвърждавам: Декан: CS 206 ИЗКУСТВЕН ИНТЕЛЕКТ Приета: прот. 8 от г.; Актуализирана

Homework 2

Структура на програма в C - Част 6 - goto, switch, break и continue клаузи

Анализ и оптимизация на софтуерни приложения

Машинно обучение Лабораторно упражнение 3 Работа с функции, файлове и графики 1. Допълнителни сведения за функции 1.1. Стойности на аргументите по под

Подаване на информация в ИСИС - описание с примерни екрани

Препис:

Advanced C++ Memory Management Йордан Димитър Зайков Трендафилов

Memory Management Effective C++ 2 nd ed: 3, 5, 7, 8, 9, 10 More Effective C++: 1, 3, 8 Exceptional C++: 35, 36

Какво всъщност прави new? Грубо казано: Заделя памет void * operator new(size_t size); Вика конструктор върху нея (не важи за вградените типове)

Пример string *ps = new string("memory Mngmnt"); => // get raw memory for a string object void *memory = operator new(sizeof(string)); // initialize the object in the memory call string::string("memory Mngmnt") on *memory; // make ps point to the new object string *ps = static_cast<string*>(memory);

Предпочитайте new / delete пред malloc / free Пример: string s1 = malloc(10 * sizeof(string)); string s2 = new string[10]; Как ще инициализирате обектите, сочени от s1? А после как ще ги деструкторирате? Никога не смесвайте new с free или malloc с delete!

Не смесвайте new с delete [ ] и new [ ] с delete delete / delete [ ] приемат за аргументи само един указател. Как да решат колко памет да освободят (и колко деструктора да викнат)? T * p = new T[n]; T * p = new T;

Ами ако няма достатъчно памет? operator new хвърля std::bad_alloc, не връща NULL Но преди това вика Ваша функция за обработка на грешки: typedef void (*new_handler)(); new_handler set_new_handler(new_handler p) throw(); Дефинирани са в <new> Така не се налага да пишете try / catch всеки път

Глупав пример void nomorememory() { cerr << "Unable to satisfy request for memory\n"; // abort(); } int main() { std::set_new_handler(nomorememory); int *pbigdataarray = new int[1000000000l];...

Цялата истина за ::operator new void * operator new (size_t size) { if (size == 0) size = 1; while (1) { attempt to allocate <size> bytes; if (the allocation was successful) return (a pointer to the memory); new_handler globalhandler = set_new_handler(0); set_new_handler(globalhandler); } } if (globalhandler) (*globalhandler)(); else throw std::bad_alloc();

new_nandler трябва да прави едно от следните: Да увеличава количеството налична памет Да задава различен манипулатор на new Да отменя манипулатора на new Да хвърля std::bad_alloc или негов наследник Да прекъсва изпълнението на програмата

operator new се наследява class Base { public: static void * operator new (size_t size);... }; // Derived не предефинира operator new class Derived: public Base {... }; // Извиква се Base::operator new! Derived *p = new Derived;

Как да постъпим? Правете проверка за коректност на големината във Вашите версии на operator new: void * Base::operator new(size_t size) { if (size!= sizeof(base)) return ::operator new(size); } // Вашият operator new идва тук

placement new Не заделя памет, а само конструира обект върху вече заделена памет. Синтаксис: new (location) class_name; new (location) class_name [count]; operator new на placement new: void * operator new (size_t, void * location) { return location; }

Избягвайте да скривате нормалната форма на operator new Как пък така да я скрия?! Пример: class C { public: static void * operator new(size_t size, new_handler p);... }; C * px1 = new (specialerrorhandler) C; C * px2 = new C; // добре // грешка

Как да постъпим? Използвайте делегация static void * operator new(size_t size) { return ::operator new(size); } Или подразбиращи се параметри static void * operator new(size_t size, new_handler p = 0);

operator delete() void Base::operator delete(void *rawmemory, size_t size) { if (rawmemory == 0) return; if (size!= sizeof(base)) { ::operator delete(rawmemory); return; } deallocate the memory pointed to by rawmemory; } return;

class C { public: C(int _x) : x(_x) { std::cout << x << std::endl; } ~C() { std::cout << "~" << x << std::endl; } int x; }; C * p = static_cast<c*>(operator new(2 * sizeof(c))); new (p) C(3); new (p+1) C(5); p[1].~c(); p[0].~c(); operator delete(p); // 3 // 5 // ~5 // ~3

Даден е следният код: class B { public: virtual ~B(); void operator delete ( void*, size_t ) throw(); void operator delete[ ] ( void*, size_t ) throw(); void f( void*, size_t ) throw(); }; class D : public B { public: void operator delete ( void* ) throw(); void operator delete[ ] ( void* ) throw(); };

Кой operator delete ще се извика? D* pd1 = new D; delete pd1; B* pb1 = new D; delete pb1; D* pd2 = new D[10]; delete[ ] pd2; B* pb2 = new D[10]; delete[ ] pb2;

Още няколко съвета Предоставите ли една от new (new [ ]) или delete (delete [ ]), предоставяйте и другата! Винаги декларирайте operator new() и operator delete() като статични функции (те винаги са такива)! Никога не третирайте масивите полиморфично!

Custom Allocators https://molecularmusings.wordpress.com/2012/0 8/14/memory-allocation-strategies-a-linear-al locator/ http://www.codingwisdom.com/codingwisdom/20 12/09/you-need-a-frame-allocator.html https://github.com/emeryberger/heap-layers https://github.com/emeryberger