我很难理解sbrk()
和mmap()
,以及munmap()
。
这与如何释放 sbrk() 获得的内存密切相关?但我还有更多问题。
如果我有以下程序:
int main(void) {
void* first = sbrk(4096);
void* second = sbrk(4096);
return 0;
}
据我了解,sbrk()
将通过传入的值增加堆的大小,然后返回指向该内存段开头的指针。
因此,例如,如果当前堆中断(堆结束)在 0x1000,并且我调用void* first = sbrk(4096)
,那么堆中断将在 0x2000 并且返回的指针将是 0x1000。
所以我假设当我调用时void* second = sbrk(4096)
,堆中断将在 0x3000 并且返回的指针将是 0x2000?
说到释放这块内存,我知道如果你sbrk()
再次调用,我认为 sbrk(-4096) 会释放堆内存。但是那不是void* second
免费的吗,如果我想免费void* first
怎么办?
另外,我可以使用 munmap 取消映射分配的内存sbrk()
吗?所以调用类似的东西,munmap(second, 4096);
或者只能在我用来mmap()
分配内存的情况下使用?
谢谢,胡安
请注意,这是大学作业,我只会使用 malloc 和 free,但作业是重新实现 malloc。