多年来,这一直困扰着我。
我们都在学校里受教(至少在我以前是这样),您必须释放分配的每个指针。但是,对于不释放内存的实际成本,我有点好奇。在某些明显的情况下,例如在malloc
循环或线程执行的一部分内调用when时,释放非常重要,这样就不会发生内存泄漏。但是,请考虑以下两个示例:
首先,如果我有这样的代码:
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)
,实际上没有任何事情可以释放内存!它仅重置malloc的libc实现中的一些指针,这些指针跟踪大的映射内存页面(通常称为“堆”)中的可用内存块。该页面仍将仅在程序终止时才释放,而不是在此之前终止。