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

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

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

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

19.11.2010, 12:27. Просмотров 1173. Ответов 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++
Хочу написать свои аналоги malloc free. Загвоздка в том, что я не знаю как освобождать потом память, ведь VirtualFree не может освободить...

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

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

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

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

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

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

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

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


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

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

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