分配pthread_mutex_t *使用“malloc()”,当程序中止或退出时,是否需要释放它? 如果不是免费的话,会有问题吗? 我知道,系统将在您的进程终止时回收内存。 pthread_mutex_t可能会产生不良影响吗?
就像问题一样:
我的程序(文本模式Web浏览器)正在动态分配内存。
当然,我在运行时释放不需要的块。并且我在正常终止之前释放所有内容 - 因此内存泄漏检查器不会给我误报(并且如果需要进行重大重构则要灵活)。
现在,我不做的是在异常终止前释放内存。 (目前,我的程序在信号和mallocs / reallocs失败后终止。)
我的问题是:你认为这种不好的风格吗?我应该免于异常终止吗?
答案 0 :(得分:2)
我对所有这些'正常终止时的所有免费'口头禅(或甚至异常终止)的看法,通常是下行风险超过上行:
1)操作系统经过数十亿用户的设计,测试和浸泡测试。在停止任何核心上的任何状态的每个线程后,它可以轻松地释放所有剩余分配的内存。你能用你的用户代码做到这一点 - 没有。
2)您必须添加代码才能执行此操作。每次添加代码时,都可能会添加更多错误。除非你是一个操作系统,否则试图在繁忙的复杂多线程系统中释放所有已分配的内存是一场噩梦。内存遍布整个地方,在线程变量,队列等中,并且可能或可能不是,当前由一个或多个线程访问。所有权不确定且不断变化。你会怎么做?
3)您必须不断测试和扩展关机系统,以确保在更改/增强/升级后释放所有内存。
4)不断检查线程中的'terminate'标志等,这样线程可以在关机时释放一些内存,这是额外的开销。
5)无论如何,许多库在关闭时都不会释放所有内存。如果库是不透明/半透明的,您可能无法对其进行任何操作。
6)如果一个线程抛出一个严重的异常,那么内存可能处于这样一种状态:试图从用户代码中释放它将导致其他线程中出现更多异常。
7)风险/回报 - 很好,干净Valgrind输出与来自客户的电话/电子邮件嘿,您的应用有时不会关闭,我们必须致电管理员以杀死-9 / TaskManager'。8)过滤并计算SO re上的所有线程。 “无法阻止我的线程关闭我的应用程序。”
对于某些应用程序,一些线程可能不得不在正常关闭时以结构化方式终止,例如。提交和关闭数据库连接,刷新和关闭文件。释放内存不属于该类别,即使是正常关机也是如此。
如果您的应用确实遇到严重问题,则不应尝试“清理”内存 - 您的应用已经很脏,需要报废并更换新实例。