如果您在程序终止前的malloc之后没有空闲,会发生什么情况? [英] What REALLY happens when you don't free after malloc before program termination?

查看:19
本文介绍了如果您在程序终止前的malloc之后没有空闲,会发生什么情况?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

首先,如果我有如下代码:

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

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

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

推荐答案

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

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

但是,在不再需要内存时立即释放内存,并在程序退出时释放所有剩余内存,这被认为是一种很好的方式。它更像是一种练习,目的是了解您正在使用的内存,并考虑您是否仍然需要它。如果您不跟踪,可能会有内存泄漏。

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

这篇关于如果您在程序终止前的malloc之后没有空闲,会发生什么情况?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆