Форум программистов, компьютерный форум 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 а в екселе конечно. подробнее

Показать сообщение отдельно
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183

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

03.08.2012, 15:53. Просмотров 2042. Ответов 17
Метки (Все метки)

Помогите пожалуйста разобраться! Непонимаю примера из Т.А. Павловская "C/C++ Программирование на языке высокого уровня" для большей ясности цитирую


Перегрузка операции выделения памяти применяется для экономии памяти, повышения быстродействия программы или для размещения данных в некоторой конкретной области. Например, пусть описывается класс, содержащий указатель на некоторый объект:

C++
1
2
3
4
5
6
7
8
class Obj{...};
 
class pObj
{
    ...
    private:
        Obj *p;
};
При выделении памяти под объект типа pObj с помощью стандартной операции new

C++
1
pObj * p = new pObj;
фактическое количество байтов будет превышать sizeof(pObj), поскольку new обычно записывает в начало выделяемой области ее размер [2](для того чтобы правильно отрабатывала операции delete):

Для небольших объектов эти накладные расходы могут оказаться весьма значительными. Для экономии памяти можно написать собственную операцию new класса pObj, которая будет выделять большой блок памяти, а затем размещать в нем указатели на Obj. Для этого в объекте Obj вводится статическое поле headOfFree, в котором хранится указатель на первую свободную ячейку блока для размещения очередного объекта.

Неиспользуемые Ячейки связываются в список. Чтобы не занимать память под поле связи, используется объединение union:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class pObj
{
public: 
    static void * operator new (size_t size);
    private:
        union 
        {
            Obj * p;
            pObj * next;
        };
 
        static const int BLOCK_SIZE; 
        static pObj * headOfFree;
};
 
void * pObj::operator new(size_t size)
{
    //Перенаправить запросы неверного количества памяти стандартной операции new
    if(size != sizeof(pObj))
        return :: operator new (size);
    pObj * p = headOfFree; // указатель на первую свободную ячейку.
    //Переместить указатель списка свободных ячеек:
    if(p) headOfFree = p->next;
    //Если свободной памяти нет, выделяем очередной блок:
    else 
    {
        pObj * newblock = static_cast<pObj*>(::operator new(BLOCK_SIZE * sizeof(pObj)));
//Все ячейки свободны, кроме первой (она будет занята), связываем их
        for(int i = 1; i < BLOCK_SIZE - 1; i++)
            newblock[i].next = & newblock[i+1];
        newblock[BLOCK_SIZE - 1].next = 0;
        //Устанавливаем начало списка свободны ячеек:
        headOfFree = &newblock[1];
        p = newblock;
    }
 
    return p;
}
 
pObj * pObj::headOfFree;
const int pObj::BLOCK_SIZE = 1024;
Естественно, что если операция new перегружена, то же самое должно быть выполнено и для операции delete (например, в нашем случае стандартная операция delete не найдет в начале объекта верной информации о его размерах, что приведет к неопределенному поведению программы).

В рассмотренном примере операция delete должна добавлять освобожденную ячейку памяти к списку свободных ячеек:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void pObj::operator delete(void * ObjToDie, size_t size)
{
    if(ObjToDie == 0)return;
    if(size != sizeof(pObj))
    {
        ::operator delete(ObjToDie); 
        return;
    }
 
    pObj * p = static_cast<pObj * >(ObjToDie);
    p->next = headOfFree;
    headOfFree = p;
}
Т.А. Павловская "C/C++ Программирование на языке высокого уровня"
1. Так вообще кто-нибудь делает, часто, редко? в каких еще случах, кроме выше перечисленных...
2. Эту дополнительную информационную ячейку возвращает функция operator new? т.е. когда я выделяю в программе память:

C++
1
pObj * newblock = static_cast<pObj*>(::operator new(BLOCK_SIZE * sizeof(pObj)));
То выделяется BLOCK_SIZE * sizeof(pObj) + sizeof(unsigned int) байт? где область памяти размером sizeof(unsigned int) - для размещения информации о количестве байтов?

3. В данном примере экономия по памяти заключается в том, что все лишь одна такая ячейка будет выделена взамен 1024-ем? и поэтому в строке 30 в комментариях пишется //Все ячейки свободны, кроме первой (она будет занята). Т.е. будет занята информацией о количестве выделенной памяти?

4. Что будет когда мы впервый раз выделим область памяти

C++
1
pObj * p = new pObj;
Меня просто смущает, что в строке 36

C++
1
p = newblock;
присваивается самое начало этой области, т.е. &newblock[0], в то время как сказанно, что она занята...(стр. 30) (как я понял информационной часть или она ею все же не занята или чем она вообще занята?) и этот указатель возвращается из функции...т.е. указатель на занятую ячейку? Или что в этом комментарии подразумевалось?

5. И как эта область выделенная (BLOCK_SIZE*sizeof(pObj)) вообще освободится...ведь в переопределении operator delete нет никакого высвобождения памяти, а лишь перенаправление указателей в случае соответствия размеров????????

Добавлено через 6 минут
Расскажите поподробней как это все происходит, а то ничего не понятно...
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru