【问题标题】:brk() exceeding the heap when implementing malloc()brk() 在实现 malloc() 时超出堆
【发布时间】:2021-03-05 02:26:43
【问题描述】:

我正在尝试实现我自己的内存分配器 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)

谁能告诉我如何解决这个问题?

【问题讨论】:

  • 该错误消息来自您的类测试框架,因此我们很难确定它的含义。特别是因为您没有向我们提供要求的全文。但总的来说,您的分配代码看起来是错误的。您每次都将堆大小增加多个元数据块。相反,您应该将堆大小增加size+sizeof(obj_metadata),或者更好的是,仅在需要来自块的分配时将堆大小增加固定块,直到块不能满足分配请求。

标签: c malloc dynamic-memory-allocation heap-memory sbrk


【解决方案1】:

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

sbrk(size * sizeof(obj_metadata));

在阅读man sbrk 之后显然是错误的。考虑做

sbrk(size);

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

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

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

【讨论】:

    猜你喜欢
    • 2020-08-14
    • 1970-01-01
    • 2015-08-13
    • 2011-07-04
    • 2017-04-26
    • 2010-11-03
    • 2020-08-27
    • 2011-07-22
    • 2015-02-14
    相关资源
    最近更新 更多