如何释放由 sbrk() 分配的内存?我可以使用 munmap 吗?

How to free memory that has been allocated by sbrk()? Can I use munmap?

我很难理解 sbrk()mmap(),以及 munmap()

这与 How do I free memory obtained by sbrk()? 密切相关,但我还有更多问题。

如果我有以下程序:

int main(void) {

   void* first = sbrk(4096);
   void* second = sbrk(4096);

   return 0;
}

据我了解,sbrk() 会根据传入的值增加堆的大小,然后 return 指向该内存段开头的指针。

因此,例如,如果当前堆中断(堆末尾)位于 0x1000,并且我调用 void* first = sbrk(4096),则堆中断将位于 0x2000,指针 returned 将是0x1000.

所以我假设当我调用 void* second = sbrk(4096) 时,堆中断将在 0x3000 处,指针 returned 将是 0x2000?

关于释放此内存,我知道如果您再次调用 sbrk(),我认为 sbrk(-4096) 将释放堆内存。但是那不会免费void* second,如果我想免费void* first怎么办?

此外,我可以使用 munmap 从 sbrk() 取消映射分配的内存吗?所以调用 munmap(second, 4096); 之类的东西,或者只有在我使用 mmap() 分配内存时才能使用它吗?

谢谢,胡安

请注意,这是大学作业,我只会使用 malloc 和 free,但作业是重新实现 malloc。

So I assume then that when I call void* second = sbrk(4096), the heap break will be at 0x3000 and the pointer returned will be 0x2000?

是的。

When it comes to freeing this memory, I understand that if you call sbrk() again, I think sbrk(-4096), that will free heap memory. But won't that free void* second,

它将“释放秒数”——释放 4096 字节。

what happens if I want to free void* first?

你必须按顺序调用它们。

 void *first = sbrk(4096);
 void *second = sbrk(4096);
 sbrk(-4096);
 sbrk(-4096);

sbrk(-4096 * 2);.

can I used munmap to unmap that allocated memory from sbrk()?

没有

So call something like munmap(second, 4096);

没有

or can that only be used if I used mmap() to allocate the memory?

是的。


Sbrk 移动指针,returns 移动旧地址。 over-simplistic 实现可能是这样的:

char heap_memory[1000000];
char *heap = heap_memory;
char *heap_end = heap + 1000000;
void *sbrk(int toadd) {
    // check for out of memory
    if (heap + toadd > heap_end) return NULL;
    // increment heap and return the old address
    char *old_address = heap;
    heap += toadd;
    return old_address;
}

只是在某个缓冲区内移动一个指针。 mmap 是一种不同的机制,它将您选择的内存地址映射到一些数据。您不能将 sbrk 返回的值传递给 mmap.