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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Работа с указателями(небольшой вопрос насчет преобразований) http://www.cyberforum.ru/cpp-beginners/thread193731.html
*((uint*)space)=SIGNATURE; space+=sizeof(uint); Как записать в одну строчку ? *(((uint*)space)++)=SIGNATURE; так не работает = \
C++ Работа с файлами Помогите пжл найти ошибку в коде.... #include <iostream> #include <windows.h> #include <stdio.h> using namespace std; class CVector { int a; public: http://www.cyberforum.ru/cpp-beginners/thread193715.html
C++ Объектный модуль. Он всегда один или их может быть несколько после компиляции? От чего это зависит?
И напишите пожалуйста определение для объектного модуля более простым языком. Читал про него в википедии..не все понял. Так же есть еще один вопрос: объектный код и объектный модуль - в чем разница? Спасибо)
Указатели C++
Написать программу на языке C Задание: введите с клавиатуры 3 числа и выведите их на экран в порядке возрастания. Программу написать с помощью указателей.
C++ Двумерные массивы. http://www.cyberforum.ru/cpp-beginners/thread193695.html
2. В поезде 18 вагонов, в каждом из которых 36 мест. Информация о про¬данных на поезд билетах хранится в двумерном массиве, номера строк которых соответствуют номерам вагонов, а номера столбцов - номе¬рам мест. Если билет на то или иное место продан, то соответствую¬щий элемент массива имеет значение 1, в противном случае - 0. Организовать заполнение двумерного массива случайным образом....
C++ Обработка текста, удаление повторного вхождения слов Помогите написать задачу на С: Задана фраза - последовательность, содержащая от 1 до 25 слов, в каждом из которых от 1 до 10 строчных латинских букв; между соседними словами запятая, за последним словом точка. Напечатать эту же последовательность слов, но удалив из нее повторные вхождения слов. Программа должна читать текст из файла «input.txt» и выводить последовательность в файл... подробнее

Показать сообщение отдельно
Saiberg
 Аватар для Saiberg
19 / 19 / 1
Регистрация: 23.09.2010
Сообщений: 193
19.11.2010, 12:27     Менеджер памяти
Пишу менеджер памяти и возник вопрос насчет реализации 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;
    }
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 23:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru