使用 sbrk 自定义内存管理

Posted

技术标签:

【中文标题】使用 sbrk 自定义内存管理【英文标题】:Customized memory management with sbrk 【发布时间】:2014-12-07 14:53:57 【问题描述】:

以下是简单的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);


【问题讨论】:

if (memory_list.head == NULL) 这个在哪里初始化为NULL?为什么要显示有效的代码?为什么不显示不起作用的代码? @PaulMcKenzie,salmalloc 功能不起作用。 On the other hand, the following test function with almost the same parameters except for the complicated handling of linked list computes correctly and displays the result. 那么你发布的功能是否有效? void test 有效,但 salmalloc 无效。 【参考方案1】:

我发现了一些问题:

    你还没有初始化memory_listsalmalloc 缺少 else 部分,因为没有 return 在这种情况下它会返回随机垃圾。 您需要检查sbrk 的返回值,它可能会失败(但salmalloc 看起来像是在进行中,不是吗?)。 需要检查salmalloc的返回值,可能会失败。

这是适用于我的系统的版本:

#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;

【讨论】:

以上是关于使用 sbrk 自定义内存管理的主要内容,如果未能解决你的问题,请参考以下文章

C中动态内存分配器的自定义实现

在 CUDA 中混合自定义内存管理和推力

brk 和 sbrk()的使用 及分配内存方式

linux环境内存分配原理 mallocinfo

菜鸟随笔---brk()与sbrk()函数的学习与使用

第69课 技巧,自定义内存管理