20 / 20 / 2
Регистрация: 23.09.2010
Сообщений: 193
1

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

19.11.2010, 12:27. Показов 2123. Ответов 1
Метки нет (Все метки)

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

Что скажете насчет токой идеи реализации ?
Код:
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include "MemoryManager.h"
 
static uchar* baseAddr[100];//массив указателей на baseAddr участков
static uint allocAreaSize[100];//размер выделенного участка
static uint areaNumber;//кол-во выделенных участков
static const uint SIGNATURE=12345678;
 
size_t rounding(uint* forRounding)//округляет до страницы (в большую сторону)
{
    if (size_t tmp=*forRounding%PAGE_SIZE) 
        *forRounding+=PAGE_SIZE-tmp;
    return *forRounding;
}
 
uchar* SearchFreeSpace(const uint findSize)//ищет в выделенных участках свободное место размером findSize 
{
    for(uint i=0;i<areaNumber;i++)
    {
        uint freeSize=0;
        for(uint j=0;j<allocAreaSize[i];j++,freeSize++)
        {
            if(*(uint*)baseAddr[i]==SIGNATURE)
            {
                baseAddr[i]+=sizeof(uint);
                j+=*(uint*)baseAddr[i];//перемещаемся на размер выделенного блока
                baseAddr[i]+=j+sizeof(uint);
                freeSize=0;
                continue;
            }
            else if(freeSize=findSize)
                return baseAddr[i]+j-findSize;
 
            baseAddr[i]++;
        }
    }
    return NULL;
}
 
namespace my
{
    void* malloc(const uint size)
    {
        uint allocSize=size+HEADER_SIZE;
        uchar* space;
        if(space=SearchFreeSpace(allocSize))
            goto AddSignatureAndReturnSpace;
        else{//если не нашлось свободного места нужных размеров ,выделяем новую область 
            rounding(&allocSize);
            baseAddr[areaNumber]=(uchar*)VirtualAlloc(NULL,allocSize,MEM_COMMIT,PAGE_READWRITE);
            if(baseAddr[areaNumber]){
                allocAreaSize[areaNumber]=allocSize;
                space=baseAddr[areaNumber];
                areaNumber++;
                goto AddSignatureAndReturnSpace;
            }
        }
        return NULL;
        
        AddSignatureAndReturnSpace:
        *(uint*)space=SIGNATURE,space+=sizeof(uint);
        *(uint*)space++=allocSize,space+=sizeof(uint);
        return space;
    }
 
    void free(void* addr)
    {
        uchar* headerAddr=(uchar*)addr-8;
        for(int i=0;i<HEADER_SIZE;i++)//удаляем хидер. без хидера память нечего из себя не представляет.
        {
            headerAddr[i]=0;
        }
 
        static uint callFunctionSize=0;
        callFunctionSize++;
        if(callFunctionSize==10){//если 10 раз, проверяем память на свободные области и если есть удаляем
            for(uint i=0;i<areaNumber;i++)
            {
                nxtItr:
                for(uint j=0;j<allocAreaSize[i];j++)
                {
                    if(*baseAddr[i]==SIGNATURE) goto nxtItr;
                }
                VirtualFree(baseAddr[0],0,MEM_RELEASE);
            }
            callFunctionSize=0;//обнуляем счетчик вызовов функции
        }
    }
 
    void* realloc(void* addr,const uint newSize)
    {
        return 0;
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.11.2010, 12:27
Ответы с готовыми решениями:

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

Менеджер памяти
Хочу написать свои аналоги malloc free. Загвоздка в том, что я не знаю как освобождать потом...

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

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

1
Эксперт С++
1673 / 1045 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
19.11.2010, 17:27 2
C++
1
2
3
4
void free(void* addr);
 
template<typename T>
void free(T* &addr) {free((void*)addr); addr = 0;}  // Эта функция сработает на любом lvalue-указателе
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.11.2010, 17:27
Помогаю со студенческими работами здесь

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru