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

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

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

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

14.11.2010, 16:32. Просмотров 1525. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2010, 16:32     Менеджер памяти
Посмотрите здесь:

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

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

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

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

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

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

Файловый менеджер - C++
Помогите пожалуйста!!! Мне нужен файловый менеджер на Win32... (не знаю как отоброзить содержимое директории..) заранее спасибо

файловый менеджер - C++
помогите пожауйста!!! задание: написать программу файловый менеджер. желательно на с++. какой нужен компонент и что прописать чтобы...

файловый менеджер - C++
Прошу дать информацию на работу с файлами (статьи, книги) в срр, точнее необходимо сделать что-то вроде файлового менеджера с функциями...

Файловый менеджер - C++
Может у кого-то есть исходники, кому не жалко скинуть, делать думаю на visual.

файловый менеджер (консоль) - C++
помогите написать консольный файловый менеджер который может: копировать, удалять, перемещать файлы. буду рад любой помощи (наработки,...

Класс менеджер путей к файлу - C++
Добрый вечер, // Main #include &lt;iostream&gt; #include &quot;A.h&quot; #include &quot;Path.h&quot; using namespace std; int main() ...


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

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

поэтому при free() освобождения памяти не происходит, просто происходить склейка разрезанных частей и возвращение их в список свободных блоков
Yandex
Объявления
15.11.2010, 06:52     Менеджер памяти
Ответ Создать тему
Опции темы

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