Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
nate181
0 / 0 / 0
Регистрация: 27.10.2009
Сообщений: 26
1

Распределение памяти для выделения и освобождения блоков памяти внутри запрошенного пула

03.10.2010, 17:57. Просмотров 1103. Ответов 14
Метки нет (Все метки)

В программе малые"дыры" избегают,что нужно сделать что бы малые "дыры" не избегались....

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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# include <stdio.h>
# include <stdlib.h>
# include <math.h>
short int  ident[256];
typedef char block[1024];
block* megablock;
 
void givemem()
{
    int x;
    megablock=(block*)malloc(1024);
    for (x=0;x<=127;x++) ident[x]=0x00;
    printf("Adress 0=%p\n",megablock);
}
 
int curposit(short int mask,short int y)
{
    short int x;
    for (x=0;(x<=7)&&((mask>>=1)!=0);x++);
    return x+y*8;
}
 
void mark(int devi,int len)
{
    short int x,y;
    int z;
    y=(devi+len-1)/8;
    for(z=devi;z<=(devi+len-1);z++) {x=1;ident[z/8]=ident[z/8]|(x<<(z%8));}
    x=1;
    ident[y+128]=ident[y+128]|(short int)(x<<((z-1)%8));
}
 
char *give(int size)
{
int blc=((size-1)/1024)+1,rblock,freeblock=0,oldpos=-1,oldrblock=1025;
printf("\nbnc=%d\n",blc);
    short int curblock;
    for (int x=0;x<=127;x++){
    for (short int mask=1;mask<=128;mask<<=1)
    {
    curblock=ident[x]&mask;
    if (curblock==0) freeblock=freeblock+1; 
    else
    {
        rblock=freeblock-blc;
        if (rblock==0)
        {
        printf("\n1)Videlil%d",curposit(mask,x)-blc);
        mark(curposit(mask,x)-blc,blc);
        return (char*)(megablock+curposit(mask,x)-blc);
        }
        if (rblock>0)
        {
        if (oldrblock>rblock) 
        {
            oldrblock=rblock;
            oldpos=curposit(mask,x)-freeblock;
//          printf("test%d  %d",oldrblock,oldpos);
        }
        }
        freeblock=0;
    }
    }}
    rblock=freeblock-blc;
    if (rblock==0)
        {
        printf("\n3)Videlil%d",1024-blc);
        mark(1024-blc,blc);
        return (char*)(megablock+1024-blc);
        }
        if (rblock>0)
        {
        if (oldrblock>rblock) 
        {
            oldpos=1024-freeblock;
            printf("\n4)oldpos=%d",oldpos);
            mark(oldpos,blc);
            return (char*)(megablock+oldpos);
        }
        }
        else if (oldpos>=0) return (char*)(megablock+oldpos);
    return NULL;
}
 
void freem(void* thism)
{
    int raz=(int)((char*)thism-(char*)megablock),x;
//    printf("\nraz=%d",raz/1024);
    for(x=raz/1024;((ident[128+x/8]&(1<<(x%8)))==0)&&(x<=1023);x++){ident[x/8]=ident[x/8]&~(1<<(x%8));}
//    printf("xxx=%d\n",x);
    ident[x/8]=ident[x/8]&~(1<<(x%8));
    ident[x/8+128]=ident[x/8+128]&~(1<<(x%8));
}
 
int main() 
{
    int x;
    givemem();
    char*vvv=(char*)give(102);
    //char*vvv1=(char*)give(1024*4);
    //char*vvv2=(char*)give(1024*5);
    for(x=0; x<=255;x++)printf("x=%d  vol=%d\n",x,ident[x]);
    //printf("\nOtvet=%p",vvv);
    //freem(vvv1);
    freem(vvv);
    //char*vvv3=(char*)give(1024*5);
    //freem(vvv2);
    for(x=0; x<=255;x++)printf("x=%d  vol=%d\n",x,ident[x]);
    //printf("\nOtvet=%p",vvv2);
    //freem(vvv);
    free(megablock);
    printf("\nThe End\n");
    return 0;
}

Help....=)
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.10.2010, 17:57
Ответы с готовыми решениями:

Malloc ошибка освобождения памяти
ЧЯДНТ? Косяк такой: heap corruption detected before normal block (№0) at 0x... CRT detected...

Ошибка освобождения динамической памяти
Столкнулся с проблемой ошибка при очистке динамической памяти помогите разобраться что я сделал не...

Динамическое распределение памяти для символьной строки
Объясните, пожалуйста, почему при динамическом распределнии памяти под символьный массив у меня все...

Какие переменные типа CARS можно использовать для выделения динамической памяти?
Всем привет! Помогите плиз ответить на вопросы!( Вижу, что тут обсуждают в основном программы, но...

Реализовать фунцию для выделения блока свободной динамической памяти (кучи) заданного размера
4) Управления кучей. Реализовать фунцию для выделения блока свободной динамической памяти (кучи)...

14
easybudda
Модератор
Эксперт JavaЭксперт CЭксперт С++
10297 / 6179 / 1555
Регистрация: 25.07.2009
Сообщений: 11,762
04.10.2010, 16:11 2
Цитата Сообщение от nate181 Посмотреть сообщение
В программе малые"дыры" избегают,что нужно сделать что бы малые "дыры" не избегались....
А большие "дыры" пусть избегаются? Вы бы задание написали, а то трудно понять, что у Вас там происходит...
1
nate181
0 / 0 / 0
Регистрация: 27.10.2009
Сообщений: 26
04.10.2010, 20:56  [ТС] 3
про большие дыры вообще ничего не говорится,задание такое что бы малые "дыры" не избегались =)
0
Nameless One
Эксперт С++
5793 / 3442 / 356
Регистрация: 08.02.2010
Сообщений: 7,448
05.10.2010, 14:02 4
Цитата Сообщение от nate181 Посмотреть сообщение
В программе малые"дыры" избегают,что нужно сделать что бы малые "дыры" не избегались....
Что это значит?
0
05.10.2010, 14:02
nate181
0 / 0 / 0
Регистрация: 27.10.2009
Сообщений: 26
05.10.2010, 20:12  [ТС] 5
ну вот то и значит =))
0
Andrew_Lvov
Эксперт С++
260 / 190 / 10
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
05.10.2010, 20:53 6
Я думаю, вам стоит сперва почитать теорию о больших чёрных дырах, а потом уже заняться малыми. Недавно, кстати, учёные из непомню какой страны синтезировали чёрную (по их словам) дыру в лабораторных условиях. Правда, просущестовала она недолго.
В любом случае, работы по этим дырам уже ведуться, я уверен в инете есть куча статей на эту тему.
1
nate181
0 / 0 / 0
Регистрация: 27.10.2009
Сообщений: 26
05.10.2010, 21:25  [ТС] 7
какие ещё чёрные дыры О_О всего-то надо в программе сделать что бы малые "дыры" не пропускали...речь идёт о малых "дырах",не прокакие большие понятия не имею....в программе Стратегия размещения:"Наилучший подходящий", Структура данных:"Блоки фиксированного размера" воот =) может хоть чем то поможет =)
0
Nameless One
Эксперт С++
5793 / 3442 / 356
Регистрация: 08.02.2010
Сообщений: 7,448
06.10.2010, 04:05 8
nate181, а нельзя объяснить подробнее, что такое эти малые "дыры"? "Дыры" в чем? А то пока наиболее правдоподобным остается вариант Andrew_Lvov'a, но тогда, я боюсь, мало кто сможет тебе помочь - теоретических знаний не хватит
1
nate181
0 / 0 / 0
Регистрация: 27.10.2009
Сообщений: 26
21.10.2010, 22:44  [ТС] 9
Вот задание:Программа должна в начале работы запросить большой блок памяти (пул) у операционной системы ,а затем применять собственные процедуры распределения памяти для выделения и освобождения блоков памяти внутри запрошенного пула.Процедура распределения памяти считаются процедуры выделения блока памяти заданного размера и освобождения ранее выделенного блока памяти.Процедура выделения блока памяти должна возращать спецификатор начала выделенного блока.Поцедура освобождения блока памяти должна освобождать блок,заданный спецификатором...Выше у меня написанно Стратегия размещения:Наилучщий подходящий,Структура данных:блоки фиксированного размера...а малые дыры у меня избегаются...а нужно что бы они не избегались..как сделать что бы они не избегались???
0
Nameless One
Эксперт С++
5793 / 3442 / 356
Регистрация: 08.02.2010
Сообщений: 7,448
22.10.2010, 04:07 10
Цитата Сообщение от nate181 Посмотреть сообщение
а малые дыры у меня избегаются
Что такое "малые дыры"?!
0
easybudda
Модератор
Эксперт JavaЭксперт CЭксперт С++
10297 / 6179 / 1555
Регистрация: 25.07.2009
Сообщений: 11,762
22.10.2010, 07:09 11
Цитата Сообщение от Nameless One Посмотреть сообщение
Что такое "малые дыры"?!
Наверное, что-то вроде
C
1
2
3
4
struct TAGname{
  char c;
  int i;
};
трёх байтов между c и i
0
silent_1991
Эксперт С++
5016 / 3076 / 271
Регистрация: 11.11.2009
Сообщений: 7,045
Завершенные тесты: 1
22.10.2010, 07:14 12
nate181,
Заделать их цементом?..
0
nate181
0 / 0 / 0
Регистрация: 27.10.2009
Сообщений: 26
22.10.2010, 09:06  [ТС] 13
малые дыры это куски памяти малого объёма =)
0
silent_1991
Эксперт С++
5016 / 3076 / 271
Регистрация: 11.11.2009
Сообщений: 7,045
Завершенные тесты: 1
22.10.2010, 09:07 14
А почему на это понадобилось 13 сообщений темы? Нельзя было сказать в первом?)))
0
nate181
0 / 0 / 0
Регистрация: 27.10.2009
Сообщений: 26
22.10.2010, 09:33  [ТС] 15
нуу..сначала я сама не знала,что это..думала тут знают...а не давно узнала,вот и написала =)
0
22.10.2010, 09:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.10.2010, 09:33

Ошибка при переходе в функцию освобождения памяти из под списка
При переходе в функцию Clear вылетает с сообщением что куча была повреждена. Какая строка ее...

Почему после освобождения памяти получается записать туда значение
Здравствуйте! Вот код: #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; int main() { int * p...

Написать функции для работы с массивом - выделения/освобождения памяти, консольного ввода/вывода
Напишите функции: 1) выделяющую память для массива данных типа float, 2) заполняющую ячейки...


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

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

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