malloc()
时,释放内存非常重要以避免内存泄漏。但是考虑以下两个示例:首先,如果我的代码类似于这样:
int main()
{
char *a = malloc(1024);
/* Do some arbitrary stuff with 'a' (no alloc functions) */
return 0;
}
这里的真正结果是什么?我的想法是,进程会死亡,然后堆空间也会消失,因此错过调用free
并没有什么损失(但是,我认识到为了闭包、可维护性和良好的实践,还是有必要的)。我的想法正确吗?
其次,假设我有一个类似于shell的程序。用户可以像这样声明变量:aaa = 123
,并将其存储在一些动态数据结构中以供以后使用。显然,你会使用一些调用某些*alloc函数的解决方案(哈希表、链表等)。对于这种类型的程序,从malloc
调用后永远不释放它们是没有意义的,因为这些变量在程序执行期间始终存在,并且我无法找到好的方法(静态分配空间的话)来实现这一点。拥有大量已分配但仅在进程结束时释放内存的做法是糟糕的设计吗?如果是,那么替代方案是什么?
free(a)
并不能真正释放内存!它只是重置了libc实现的malloc中一些指针,这些指针跟踪内存页(通常称为“堆”)中可用的内存块。当你的程序终止时,该内存页才会被释放,而不是在此之前。 - Marco Bonellimalloc()
分配的内存来自“正常”的sbrk
堆,并且位于其末尾,则会调用sbrk()
来减少内存映像。如果malloc()
通过mmap()
分配了内存,则在free()
中取消映射该内存。 - glglgl