Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Перегрузка new и delete - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Сравнение int с элементом enum http://www.cyberforum.ru/cpp-beginners/thread632583.html
Доброго времени суток. У меня возник вопрос следующего содержания: Пишу прогу на Qt, в некоторой части программы необходимо произвести перебор по перечислению: enum SearchParameter { Id,...
C++ Определение конца строки Могу ля как то определить, закончилась ли строка через символ \n? Он занимает одну позицию, или две? http://www.cyberforum.ru/cpp-beginners/thread632540.html
Удалить из строки все подстроки C++
Помогите пожалуйста написать функцию удаляющую из строки s все подстроки s1 с испотльзованием <string> Добавлено через 1 минуту void mydelete(string s, string s1) { int r=0; int...
Пределы Int C++
Нужно найти такое максимальное n, чтобы Фиба не выходила за пределы int и вывести его. #include <iostream> using namespace std; int main() { unsigned int f1, f2, fnext, n; f1 = 0; f2...
C++ Побороть LPCWSTR http://www.cyberforum.ru/cpp-beginners/thread632425.html
Всем привет. Пишу программку на WinApi но столкнулся с простой проблемой. Мне нужно программно вставить текст в Edit. Код примерно такой: TCHAR FullPath = {0}; .......... SetWindowText(...
C++ Вывод в Файл С++ Добрый день подскажите пожалуйста как вывести данные из программы в файл ексель и сделать чтоб он сохранялся а не каждый раз когда к нему обращалась программа он перезаписывался. Я знаю способ... подробнее

Показать сообщение отдельно
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
03.08.2012, 16:37
Не по порядку отвечу. Всё нижеследующее на истину не претендует.

Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
1. Так вообще кто-нибудь делает, часто, редко? в каких еще случах, кроме выше перечисленных...
Делают.
1) Довольно часто на платформах, отличных от Винды, Линукса и т.д., требуется свой распределитель памяти, стандартный может не выполнять накладываемых на него требований.
2) Так же для некоторых классов может потребоваться выделение памяти не из кучи, а из пула или ещё как-нибудь, а хочется использовать единообразие при создании объектов. В этом случае тоже можно перегружать операторы new/delete.
3) Ну и самый простой случай - когда нужно запретить создание объектов по new/delete.

Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
присваивается самое начало этой области, т.е. &newblock[0], в то время как сказанно, что она занята...(стр. 30) (как я понял информационной часть или она ею все же не занята или чем она вообще занята?) и этот указатель возвращается из функции...т.е. указатель на занятую ячейку? Или что в этом комментарии подразумевалось?
Тут всё верно. Возвращается указатель на ту область памяти, куда разместился выделяемый объект. Собственно, этим объектом эта область и занята. А указатель на свободную ячейку устанавливается равным следующей области.

Кстати, подобный пример описан в книжке Александреску "Современное проектирование на С++". Книжка там совсем не об этом, но такой параграф там присутствует.

Добавлено через 3 минуты
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
4. Что будет когда мы впервый раз выделим область памяти
C++
1
pObj * p = new pObj;
В первый раз выделится память сразу под 1024 (BLOCK_SIZE) объектов. Потом будет просто возвращаться указатель на следующий свободный элемент.

Добавлено через 6 минут
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
2. Эту дополнительную информационную ячейку возвращает функция operator new?
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
5. И как эта область выделенная (BLOCK_SIZE*sizeof(pObj)) вообще освободится...ведь в переопределении operator delete нет никакого высвобождения памяти, а лишь перенаправление указателей в случае соответствия размеров?
Тут не гарантирую правильности совсем, но по идее при выделении памяти по new с указанием
размера никакой доп.ячейки не создаётся. Потому и в операции delete нет освобождения памяти. Память выделена один раз и используется для новых объектов. Когда удалятся все объекты, указатель станет равным значению самой первой области памяти.

Добавлено через 10 минут
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
3. В данном примере экономия по памяти заключается в том, что все лишь одна такая ячейка будет выделена взамен 1024-ем? и поэтому в строке 30 в комментариях пишется //Все ячейки свободны, кроме первой (она будет занята). Т.е. будет занята информацией о количестве выделенной памяти?
Да. Экономия не только в памяти, но и во времени исполнения. По сути стандартный new мы вызываем один раз, вместо тысячи двадцати четырёх раз. Все накладные расходы - это указатель на свободную область и константа размера блока, которые вообще статические.
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru