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

списки(управление свободной памятью ОС в С) - C++

Восстановить пароль Регистрация
 
aurora_87
0 / 0 / 0
Регистрация: 14.01.2010
Сообщений: 5
09.06.2010, 21:30     списки(управление свободной памятью ОС в С) #1
Необходимо написать программу выделения и возврата свободной памяти по алгоритму "наиболее подходящему".
Существуют свободные участки(дыры) ( наверное, нужно хранить размер участка и адрес), вводим размер задания и ищем дыру, размер которой меньше всех превосходит размер требуемого задания и помещаем туда это задание. Для облегчения поиска список дыр должен быть отсортирован по возрастанию размеров дыр.
Помогите исправить программу: может можно как-то проще сделать, в массивах например
Код
#include <stdio.h>

#define BUF_SIZE 1024 // обьем памяти

#define BSIZE sizeof(block)


typedef struct block 
{
  long size;  
  struct block* next;

} block;
// память
char buffer[BUF_SIZE];


void* my_malloc(long size)
{
  static char is_first = 1;
 
 block *p, *prev, *min;
  
p = prev = min = NULL;
  
  
if(size <= 0)  return NULL;
  
  
if(is_first) 
{  // создание фиктивного блока( голова списка )
    
p = (block*)buffer;
    
p->next = p + 1;
    p->size = 0;
    
p++;
    p->next = NULL;
    
p->size = BUF_SIZE - 2*BSIZE; 
    
is_first = 0;
  }

  
size = (size + BSIZE - 1) &~ (BSIZE - 1);  // доводим размер нужной памяти до кратности размера блока
  
p = (block*) buffer;   
 
p = p->next;
  min = p;

// нахождение минимального элемента в списке
  
for(; p != NULL; prev = p, p = p->next)
    
if( p->size > size && p->size < min->size ) min = p; 
  
p = min;
    
  
  
if( !p )  return NULL;
  
  
if(p->size > size) {
    p->size -= size + BSIZE;   // отрезание нужного куска памяти от найденного блока
    
p = (block*)(((char*)p) + p->size + BSIZE);  
   
 p->size = size;
    p->next = NULL;
  }
else
    prev->next = p->next;
   
 return (void*) ((block*) ( (char*)p + BSIZE) );
}



void my_free(void *ptr)
{
  block *p, *tmp, *t;
  
p = (block*) buffer;
  tmp = NULL;
  
t = (block*)((char*)ptr - BSIZE);
  
  
if( !ptr) return;
  
  // поиск подходящего места для вставки в список с сохранением предыдущего элемента( имитация двусвязного списка )
  
for(; p && p < t; tmp = p, p = p->next); 
  
  
t->next = tmp->next;
  tmp->next = t;
  
  
// обьединение свободных блоков
  
if( (block*)((char*)t + BSIZE + (t->size)) == t->next)
{ 
    t->size += t->next->size + BSIZE;
   
 t->next = t->next->next;
  }
  
if( (block*)((char*)tmp + BSIZE + tmp->size) == tmp->next )
{
    tmp->size += t->size + BSIZE;
    tmp->next = t->next;
  
}

}


void print()
{
  block *p = NULL;
  
int i = 1;
 
 p =(block *) buffer;
  
while (p != NULL)
{
    
printf("%d, p = %p, p->size = %ld, p->next = %p\n",i++, p, p->size, p->next);
    
//printf("%d ", p->size);
    
p = p->next;
  
}
  
printf("\n");

}


int main() 
{
  char *a = my_malloc(100);
  
print();
  
char *b = my_malloc(234);
 
 print();
 
 my_free(a);
 
 print();
 
 char *c = my_malloc(150);
 
 char *d = my_malloc(5);
 
 my_free(c);
  my_free(b);
  
print();
  
my_free(d);
  
print();
  
return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.06.2010, 21:30     списки(управление свободной памятью ОС в С)
Посмотрите здесь:

управление памятью C++
Работа с allocator (управление памятью) C++
C++ Программирование с использованием ссылок. Управление памятью в С++
Управление памятью C++
C++ Куда деваются одномоментные указатели, или управление памятью в работе с std::string
Управление динамической памятью при работе с классами C++
Нужен материал для статьи про управление памятью в С++ C++
Списки, как склеить списки между собой? C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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