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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
Saiberg
19 / 19 / 1
Регистрация: 23.09.2010
Сообщений: 193
#1

Менеджер памяти - C++

14.11.2010, 16:32. Просмотров 1567. Ответов 1
Метки нет (Все метки)

Хочу написать свои аналоги malloc free.
Загвоздка в том, что я не знаю как освобождать потом память, ведь VirtualFree не может освободить только n-ное кол-во байт.Как поступить ?

Накидал чуть-чуть.Подход думаю впринцепи не правильный
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
static size_t usageAllocSize;//сколько используется
static size_t totalAllocSize;//сколько выделено
static byte* currectAddr;// указатель на текущую пам
static byte* baseAddr;
 
size_t* rounding(size_t* forRounding)//округляет до страницы (в большую сторону)
{
    if (size_t tmp=*forRounding%PAGE_SIZE) 
        *forRounding+=PAGE_SIZE-tmp;
    return forRounding;
}
 
void* my_malloc(const size_t size)
{
    if(!usageAllocSize){//если функция вызывается первый раз.(до этого не выделялась память)
        size_t allocSize=size;
        baseAddr=(byte*)VirtualAlloc(NULL,*rounding(&allocSize),MEM_COMMIT,PAGE_READWRITE);
        currectAddr=baseAddr+size,usageAllocSize+=size,totalAllocSize+=allocSize;
    }
    else{
        size_t freeMemory=totalAllocSize-usageAllocSize;
        if(size<=freeMemory)//если хватает выделенной до этого памяти
            usageAllocSize+=size,currectAddr+=size;
        else {//переаллокация
            size_t allocSize=totalAllocSize/REALLOC_PR;
            if(allocSize<size)//если не хватает 50% памяти выделенной до этого
                allocSize=size;
            byte* temp=(byte*)VirtualAlloc(NULL,*rounding(&allocSize),MEM_COMMIT,PAGE_READWRITE);
            if(temp){
                my_memcpy(temp,baseAddr,usageAllocSize);
                VirtualFree(baseAddr,0,MEM_RELEASE);
                totalAllocSize+=allocSize,usageAllocSize+=size;
                baseAddr=temp,currectAddr=baseAddr+size;
 
            }
        }
    }
    return currectAddr-size;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2010, 16:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Менеджер памяти (C++):

Выделить в памяти 1024 ячейки по 8 байт и вывести их адреса(МИНИ менеджер памяти)) - C++
Вот тут появилась такая интересная задача: требуется сделать программу которая управляет 1024 ячейками памяти по 8 байт каждая. т.е. за...

Менеджер памяти - C++
Пишу менеджер памяти и возник вопрос насчет реализации free. Как бы из функции убить переданный указатель ? то есть занулить его......

Менеджер памяти - C++
Доброго времени суток. Столкнулся с такой проблемой... Необходимо написать эмулятор менеджера памяти, т.е. создать какой нибудь...

Менеджер сегментированной памяти - C++
Добрый вечер. Очень нужна помощь. Есть менеджер сегментированной памяти. Все вроде бы работает нормально, но преподаватель сказал, что в...

Как написать менеджер памяти - C++
помогите написать менеджер памяти на с++

Освобождает ли память процесса менеджер памяти Windows? - C++
Если моя программа допускает кучу memory leaks - ов, то после закрытия процесса программы утерянная (утёкшая) память будет так же...

1
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
15.11.2010, 06:52 #2
вообще она сделана по-другому
есть список свободных блоков, который содержит указатели на один большой кусок, взятый у системы при первом вызове выделяющей функции
если этого куска не хватает, то у системы запрашивается ещё один большой кусок и подключается к этому списку

поэтому при free() освобождения памяти не происходит, просто происходить склейка разрезанных частей и возвращение их в список свободных блоков
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2010, 06:52
Привет! Вот еще темы с ответами:

Зачем нужно освобождать память динамических объектов в деструкторе, если всё равно это сделает менеджер памяти - C++
Не скажу за все ОС-и, но под Windows есть менеджер памяти. Когда по ходу кода встречается new, ну или что - то другое для алокации...

Можно ли разместить переменную в нужную ячейку памяти и реально ли хранить данные, разбросанными по памяти? - C++
Добрый день. Не могу найти информацию по двум вопросам : 1) могу ли я разместить переменную в нужную ячейку памяти. Например: int a...

резервирование памяти/освобождение памяти для трехмерного массива - C++
Необходимо создать трехмерный массив (A), в котором элементы вдоль направления Z выли бы выровнены по 16 байт. Есть две проблемы: ...

Распределение памяти. Динамическое выделение памяти - C++
an-1 an-2 ... a2


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.