1

使用 sbrk 释放内存时遇到问题。我通过 sbrk 一个负值,但它不会减少堆的开始。这是代码

int main(int argc, char** argv) {
    void * a = sbrk(0);
    printf("%p\n",a);

    sbrk(2);
    sbrk(-1);
    a = sbrk(0);
    printf("%p\n",a);
}

这是示例输出:

0x10734f000

0x10734f002

我不明白为什么在 sbrk 减一后打印的值没有返回为 0x10734f001 。

我不允许在这个程序中使用 malloc。这是使用 sbrk 的 malloc 和 free 的自定义实现

4

4 回答 4

2

可能是您使用的尺寸太小,因此内部发生了某种形式的舍入sbrk()。我永远不会期望这样的字节级精度,它更有可能以页面为单位工作(在典型的 Linux 系统上为 4 KB 左右)。

另外,请注意手册说:

避免使用 brk() 和 sbrk():malloc(3) 内存分配包是一种可移植且舒适的内存分配方式。

很可能malloc()知道任何限制sbrk()并处理它们,它是首选的应用程序级接口。

于 2014-03-26T16:06:38.567 回答
2

刚刚使用 MacOSX Mavericks 对其进行了测试,并且 sbrk() 的行为(几乎)与在 Linux 上相同,但有两个例外:

  • 我收到编译器警告: tst21.c:12:6: warning: 'sbrk' is deprecated [-Wdeprecated-declarations]
  • 似乎不可能使用负值将内存归还给操作系统(据我所知,这是几十年前在 SYSV4 上观察到的相同行为:释放分配的内存sbrk()是不可能的)
于 2014-03-26T18:40:19.867 回答
-1

printf 使用 malloc 从而增加了数据段的大小

于 2019-12-02T13:39:55.260 回答
-1

在不使用 printf 的情况下尝试一下,并使用调试器打印出结果。它将正常工作,结果将符合预期。堆将按预期增加 2 并减少 -1。

于 2021-05-14T17:35:17.973 回答