C自定义malloc函数不读取 block 大小

标签 c malloc

我尝试实现自定义 malloc 函数。我对尺寸部分有疑问。由于我们可以释放变量,因此可以重新分配空白空间。自定义结构为 32 位长,包含数据的大小和一个 bool 值(unsigned int free : 1),表示数据是否空闲。

这是我的 malloc 函数:

void *mymalloc(size_t size) {
if (!size) return NULL;
size_t length = align(size + sizeof(struct header));
Header current = availableHeader(size);
if (!(current==sbrk(0))) {
    Header newHeader = sbrk(length);
    if (newHeader == (void*) -1) {
        return NULL;
    }
    newHeader->size = length - sizeof(struct header);
    current = newHeader;

} else if (length + sizeof(size_t) < current->size) {

    split(current, length);
}
current->free = 0;
return current+sizeof(struct header);
}

这使用了一个名为“availableHeader”的函数,它将找到第一个可用的内存块,如果没有其他 block 是空闲的并且有足够的大小来存储数据,则为一个新的。

Header availableHeader(size_t s) {
Header current = firstHeader();
int isHeader=1;
for (;isHeader && (!current->free || current->size < s); current = current+current->size+sizeof(struct header)){
    printf("%d on %d for %d\n", current->free, current->size, s);//TEST
    if(current>=sbrk(0)){
        isHeader=0;
    }
}
return current;
}

最后,这个函数使用“firstHeader”,它返回我们创建的第一个片段,如果它是第一次调用,它会创建第一个片段。

static void *firstHeader() {
static Header b = NULL;
if (!b) {
    b = sbrk(align(sizeof(struct header)));
    if (b == (void*) -1) {
        _exit(127);
    }
    b->size = 0;
    b->free = 0;       
}
return b;
}

现在,问题是“availableHeader”永远不会返回一个已经创建的 block 。它总是导致创建一个新的,这是一种糟糕的内存管理策略。 通过测试(标记为//TEST),我看到我在“availableHeader”中的循环总是看到当前内存块的大小和空闲都为“0”。

即使有这一行,我的 malloc 函数似乎也从未设置大小:

newHeader->size = length - sizeof(struct header);

但问题仍然存在:读取“availableHeader”中的大小返回 0,即使它有另一个值。

编辑: 根据要求,结构如下:

struct header {
    unsigned int size : 29,
                 zero :  2,
                 free :  1;
};

最佳答案

当您的 availableHeader 返回一个指向可以重复使用的 header 的指针时 (free == 1 && size >= s) 您的 mymalloc函数命中 if (!(current==sbrk(0))) 因为 current 不在程序中断处。假否定为真,您分配新内存而不是重用旧内存。

关于C自定义malloc函数不读取 block 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35890638/

相关文章:

c - 修复 "undefined reference to"ft. makefile.txt 和 pthreads

c - 尝试释放分配的内存后挂起程序

c - 写入结构数组

c - 在参数问题中传递 float

c - 函数调用内的 Malloc 似乎在返回时被释放?

c - 使用字符串 C 程序/Popen 时出现段错误

c - 挣扎与malloc/realloc和结构

C-opendir + fopen

c - 没有线性搜索的 C 中的快速字典

c - 如何使用结构数组调用函数?