首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >brk()在实现malloc()时超出堆

brk()在实现malloc()时超出堆
EN

Stack Overflow用户
提问于 2020-11-22 11:20:24
回答 1查看 85关注 0票数 1

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

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

这是我实现的malloc():

代码语言:javascript
复制
#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));
    }
}

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

代码语言:javascript
复制
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)

谁能告诉我怎么才能解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2020-11-22 13:01:30

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

代码语言:javascript
复制
sbrk(size * sizeof(obj_metadata));

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

代码语言:javascript
复制
sbrk(size);

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

代码语言:javascript
复制
size_t align = size & (sizeof(obj_metadata) - 1);
if (align) size += sizeof(obj_metadata) - align;

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64950352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档