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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Saiberg
 Аватар для Saiberg
19 / 19 / 1
Регистрация: 23.09.2010
Сообщений: 193
19.11.2010, 12:27     Менеджер памяти #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;
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2010, 12:27     Менеджер памяти
Посмотрите здесь:

C++ Менеджер памяти
C++ Выделить в памяти 1024 ячейки по 8 байт и вывести их адреса(МИНИ менеджер памяти))
C++ Менеджер памяти
Как написать менеджер памяти C++
Можно ли разместить переменную в нужную ячейку памяти и реально ли хранить данные, разбросанными по памяти? C++
C++ Менеджер сегментированной памяти
C++ Освобождает ли память процесса менеджер памяти Windows?
C++ Зачем нужно освобождать память динамических объектов в деструкторе, если всё равно это сделает менеджер памяти

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1591 / 983 / 116
Регистрация: 27.09.2009
Сообщений: 1,898
Завершенные тесты: 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-указателе
Yandex
Объявления
19.11.2010, 17:27     Менеджер памяти
Ответ Создать тему
Опции темы

Текущее время: 12:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru