当我使用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减少1之后,打印的值不返回0x10734f001。
我不允许在这个程序中使用malloc。这是对malloc的自定义实现和使用sbrk的免费实现。
发布于 2014-03-26 18:40:19
MacOSX小牛和sbrk()的行为(几乎)与Linux上的行为(几乎)相同,但有两个例外:
tst21.c:12:6: warning: 'sbrk' is deprecated [-Wdeprecated-declarations]sbrk()分配的内存是不可能的)发布于 2014-03-26 16:06:38
这可能是因为您使用的大小太小,因此在sbrk()中会出现某种形式的舍入。对于这样的事情,我从来没有期望过字节级的精确性,它更有可能在页面单位中工作(在典型的Linux系统中大约是4KB)。
另外,请注意手册上写着:
避免使用brk()和sbrk():malloc(3)内存分配包是分配内存的便携和舒适的方式。
malloc()很可能知道sbrk()所具有的任何限制并加以处理,它是首选的应用程序级接口。
发布于 2022-10-07 15:33:55
int main(int argc, char **argv) {
void *a = sbrk(0);
printf("%p\n", a);
a = sbrk(2);
printf("%p\n", a);
a = sbrk(-1);
printf("%p\n", a);
a = sbrk(0);
printf("%p\n", a);
}输出:
0x560267a31000
0x560267a52000
0x560267a52002
0x560267a52001根据手册,void *sbrk(intptr_t increment)返回旧值brk时,成功。sbrk(0)返回电流brk
https://stackoverflow.com/questions/22666728
复制相似问题