gpt4 book ai didi

c - 如果您在程序终止前 malloc 之后不释放,到底会发生什么?

转载 作者:行者123 更新时间:2023-11-30 16:34:41 25 4
gpt4 key购买 nike

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

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

int main()
{
char *a = malloc(1024);
/* Do some arbitrary stuff with 'a' (no alloc functions) */
return 0;
}

这里的真实结果是什么?我的想法是,进程终止了,然后堆空间也消失了,所以错过对 free 的调用并没有什么坏处(但是,我确实认识到无论如何拥有它对于关闭、可维护性和好的做法)。我的这个想法对吗?

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

最佳答案

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

所以一般来说,除了存储超出所需的运行时成本之外,它没有任何害处。当然,在您给出的示例中,您希望保留可能使用的变量的内存,直到它被清除为止。

但是,一旦您不再需要内存,并在程序退出时释放仍然存在的任何内容,这被认为是一种很好的风格。这更多的是了解您正在使用哪些内存并思考您是否仍然需要它的练习。如果不跟踪,可能会出现内存泄漏。

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

关于c - 如果您在程序终止前 malloc 之后不释放,到底会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49236270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com