使用sbrk定制内存管理

时间:2014-12-07 14:53:57

标签: c++ c linux memory memory-management

以下是简单malloc实现的代码。使用头尾指针启动链接列表以进行内存管理。现在在函数中,当列表未初始化时,只有一个调用被实现,其中列表的头部被初始化。一旦我将基础指针返回main,程序就会给出segmentation fault。另一方面,除了复杂的链表处理之外,以下test函数具有几乎相同的参数,并且正确计算并显示结果。谁能告诉我在这里缺少什么?

#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include <sys/types.h>

typedef struct Items{
  size_t size_of_object;
  size_t free;
} Items;

typedef struct Node{
  void *ptr;
  void *next;
  Items Item;
}Node ;

typedef struct LinkedList{
  Node *head;
  Node *tail;
} LinkedList;


LinkedList memory_list;

void *salmalloc(size_t size_of_object) {
  if (memory_list.head == NULL) {

    memory_list.head = sbrk(sizeof(Node));
    memory_list.head->ptr = sbrk(size_of_object);
    memory_list.head->Item.size_of_object = size_of_object;
    memory_list.tail = NULL;
    memory_list.head->next = NULL;
    memory_list.head->Item.free = 1;

    return memory_list.head->ptr;    
  }
}

void *test(size_t size) {
  void *p = sbrk(size);
  return p;
}

void main(){
  char *p = NULL;
  char a = 'B';
  p = salmalloc(sizeof(char));
  *p = a;
  printf("%c\n", *p);

}

1 个答案:

答案 0 :(得分:1)

我看到一些问题:

  1. 您尚未初始化memory_list
  2. salmalloc缺少else部分,由于没有return,因此在这种情况下会返回随机垃圾。
  3. 您需要检查sbrk的返回值,它可能会失败(但salmalloc看起来像是正在进行的工作,不是吗?)。
  4. 您需要检查salmalloc的返回值,它可能会失败。
  5. 这是适用于我的系统的版本:

    #include <stdlib.h>
    #include <stdio.h>
    #include <assert.h>
    #include <sys/types.h>
    
    typedef struct Items{
            size_t size_of_object;
            size_t free;
    } Items;
    
    typedef struct Node{
            void *ptr;
            void *next;
            Items Item;
    }Node ;
    
    typedef struct LinkedList{
            Node *head;
            Node *tail;
    } LinkedList;
    
    
    LinkedList memory_list = { 0 };
    
    void *salmalloc(size_t size_of_object) {
            if (memory_list.head == NULL) {
                    memory_list.head = sbrk(sizeof(Node));
                    memory_list.head->ptr = sbrk(size_of_object);
                    memory_list.head->Item.size_of_object = size_of_object;
                    memory_list.tail = NULL;
                    memory_list.head->next = NULL;
                    memory_list.head->Item.free = 1;
    
                    return memory_list.head->ptr;
            } else {
                    return NULL;
            }
    }
    
    int main(){
            char *p = NULL;
            char a = 'B';
            p = salmalloc(sizeof(char));
            if (p == NULL) {
                    printf("Allocation failed.\n");
                    return 1;
            }
            *p = a;
            printf("%c\n", *p);
            return 0;
    }