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

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

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

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

19.11.2010, 12:27. Просмотров 1229. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2010, 12:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Менеджер памяти (C++):

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

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

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

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

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

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

1
Nick Alte
Эксперт С++
1642 / 1014 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2010, 17:27
Привет! Вот еще темы с ответами:

Зачем нужно освобождать память динамических объектов в деструкторе, если всё равно это сделает менеджер памяти - 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.