c-brk()在实现malloc()时超出堆



我正在尝试实现我自己版本的内存分配器malloc((。然而,有人指出,在我的情况下,brk((已经超过了最大堆。

我需要在一个进行测试的平台上运行我的代码(所以我看不到测试(。

这是我对malloc((的实现:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>

typedef struct obj_metadata {
size_t size;
struct obj_metadata *next;
struct obj_metadata *prev;
int is_free;
} obj_metadata;

void *mymalloc(size_t size)
{
if (size == 0)
{
return NULL;
}
else
{
return sbrk(size * sizeof(obj_metadata));
}
}

我在测试时遇到了这个错误:

Test "malloc-orders" exited with error: Assertion "addr <= heap + max_brk_size" at 
test_framework/intercept.c:38 failed: New brk 0x7fbe6f4c7fe0 beyond max heap size (max heap 
size=134217728, max heap=0x7fbe674c8000)

有人能告诉我怎么解决这个问题吗?

我对这个测试工具不太满意,但它似乎确实遇到了一个真正的问题。

sbrk(size * sizeof(obj_metadata));

在阅读CCD_ 1之后显然是错误的。考虑进行

sbrk(size);

这在技术上也是错误的,因为您忽略了对齐。如果测试线束真的捕捉到了这个(大多数都没有(,那么应该在mymalloc的顶部进行修复。

size_t align = size & (sizeof(obj_metadata) - 1);
if (align) size += sizeof(obj_metadata) - align;

接下来,您将编写实际的堆管理器,以便mumalloc()myfree()都能工作。工作量很大。

相关内容

  • 没有找到相关文章

最新更新