如何释放由 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
.
我很难理解 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
.