当你在malloc之后没有空的时候会发生什么?

这件事困扰了我很多年了

我们在学校里都被教导(至少我是这样)必须释放分配的每个指针。不过,我对不释放内存的真正成本有点好奇。在某些明显的情况下,例如在循环或线程执行的一部分中调用malloc时,释放内存非常重要,这样就不会出现内存泄漏。但是考虑下面两个例子:

首先,如果我有这样的代码:

int main()
{
char*a=malloc(1024);
/*使用“a”(无alloc函数)执行任意操作*/
返回0;
}

这里的真正结果是什么?我的想法是进程死亡,然后堆空间无论如何都消失了,因此错过对free的调用没有什么坏处(但是,我确实认识到无论如何拥有它对于关闭、可维护性和良好实践的重要性)。我这样想对吗

其次,假设我有一个有点像shell的程序。用户可以声明变量,如aaa=123,这些变量存储在一些动态数据结构中,以供以后使用。显然,很明显,您会使用一些调用*alloc函数(hashmap、链表之类)的解决方案。对于这类程序,调用malloc后释放这些变量是没有意义的,因为这些变量必须在程序执行期间始终存在,并且没有好的方法(我可以看到)用静态分配的空间来实现这一点。有一堆已经分配但仅在进程结束时释放的内存是一种糟糕的设计吗?如果是,还有什么选择

几乎每个现代操作系统都会在程序退出后恢复所有分配的内存空间。我能想到的唯一例外可能是Palm OS,程序的静态存储和运行时内存几乎相同,因此不释放可能会导致程序占用更多存储。(我只是在这里猜测。)

因此,一般来说,它没有什么害处,除了运行时存储超过需要的成本。当然,在您给出的示例中,您希望保留可能使用的变量的内存,直到它被清除

然而,当您不再需要内存时,立即释放内存,并在程序退出时释放仍然存在的任何内容,这被认为是一种好的方式。这更像是一种练习,了解你在使用什么记忆,并思考你是否仍然需要它。如果不跟踪,可能会出现内存泄漏

另一方面,在退出时关闭文件的类似警告有一个更具体的结果——如果您不这样做,您向它们写入的数据可能不会被刷新,或者如果它们是临时文件,则在完成后可能不会被删除。此外,数据库句柄应该提交它们的事务,然后在处理完它们后关闭它们。类似地,如果使用像C++或Objic C这样的面向对象语言,当你完成一个对象时,不释放一个对象将意味着析构函数永远不会被调用,并且类负责的任何资源可能都不会被清理。

发表评论