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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Сравнение int с элементом enum http://www.cyberforum.ru/cpp-beginners/thread632583.html
Доброго времени суток. У меня возник вопрос следующего содержания: Пишу прогу на Qt, в некоторой части программы необходимо произвести перебор по перечислению: enum SearchParameter { Id, Title, Author, Word,
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 k=s.find(s1,r); int t=s1.size(); { while(k!=string::npos)
Пределы Int C++
Нужно найти такое максимальное n, чтобы Фиба не выходила за пределы int и вывести его. #include <iostream> using namespace std; int main() { unsigned int f1, f2, fnext, n; f1 = 0; f2 = 1;
C++ Побороть LPCWSTR http://www.cyberforum.ru/cpp-beginners/thread632425.html
Всем привет. Пишу программку на WinApi но столкнулся с простой проблемой. Мне нужно программно вставить текст в Edit. Код примерно такой: TCHAR FullPath = {0}; .......... SetWindowText( GetDlgItem( hwnd, IDC_EDIT1 ), FullPath ); Получаю такую ошибку: .......NNN.cpp(179): error C2664: SetWindowTextW: невозможно преобразовать параметр 2 из "const char " в "LPCWSTR" Типы, на...
C++ Вывод в Файл С++ Добрый день подскажите пожалуйста как вывести данные из программы в файл ексель и сделать чтоб он сохранялся а не каждый раз когда к нему обращалась программа он перезаписывался. Я знаю способ вывода в файл через ofstream но он перезаписывался каждый раз когда я делаю outFile.open() а мне надо сохранить данные. Ну и если не сложно хотелось не в txt а в екселе конечно. подробнее

Показать сообщение отдельно
John Prick
755 / 688 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
03.08.2012, 16:37     Перегрузка new и delete
Не по порядку отвечу. Всё нижеследующее на истину не претендует.

Цитата Сообщение от 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 мы вызываем один раз, вместо тысячи двадцати четырёх раз. Все накладные расходы - это указатель на свободную область и константа размера блока, которые вообще статические.
 
Текущее время: 23:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru