2

分配的 pthread_mutex_t* 使用“malloc()”,当程序中止或退出时,需要释放它吗?如果不免费的话,会不会有问题?只是我知道,当您的进程终止时,系统将回收内存。pthread_mutex_t 可能有不好的影响?

就像问题一样:

我的程序(文本模式的网络浏览器)正在动态分配内存。

当然,我会在运行时释放不需要的块。而且我会在正常终止之前释放所有内容 - 这样内存泄漏检查器就不会给我误报(并且在需要重大重构时保持灵活性)。

现在,我不做的是在异常终止之前释放内存。(目前,我的程序在信号和 malloc/reallocs 失败后终止。)

我的问题是:你认为这种不好的风格吗?我应该在异常终止时释放吗?

4

1 回答 1

2

我对所有这些“在正常终止时释放一切”的口头禅(甚至是异常终止)的看法是,通常情况下,缺点大于优点:

1) 操作系统已经经过数十亿用户的设计、测试和浸泡测试。它可以在停止任何内核上处于任何状态的每个线程后轻松释放所有剩余的分配内存。你能用你的用户代码做到这一点吗 - 不。

2)您必须添加代码才能做到这一点。每次添加代码时,都可能会添加更多错误。除非您是操作系统,否则试图在繁忙的复杂多线程系统中释放所有分配的内存是一场噩梦。内存无处不在,在线程变量、队列等中,并且当前可能会或可能不会被一个或多个线程访问。所有权是不确定的并且不断变化。你要做什么?

3)您必须不断测试和扩展您的关机系统,以确保在更改/增强/升级后释放所有内存。

4)不断检查线程中的“终止”标志等,以便线程可以在关闭时释放一些内存,这是额外的开销。

5) 许多库在关闭时不会释放所有内存。如果库是不透明/半透明的,您可能无法对其执行任何操作。

6)如果一个线程抛出一个严重的异常,内存可能处于这样一种状态,试图从用户代码中释放它会导致其他线程中的更多异常。

7) 风险/回报 - 漂亮、干净的 Valgrind 输出与来自客户的电话/电子邮件“嘿,您的应用程序有时不会关闭,我们必须打电话给管理员 kill-9/TaskManager 它”。

8) 过滤和统计 SO re 上的所有线程。“无法停止我的线程以关闭我的应用程序”。

对于某些应用程序,不可避免的是某些线程可能必须在正常关闭时以结构化方式终止,例如。提交和关闭数据库连接,刷新和关闭文件。即使正常关机,释放内存也不属于该类别。

如果您的应用程序确实遇到了严重问题,您不应该尝试“清理”内存——您的应用程序已经很脏,需要报废并用新实例替换。

于 2012-10-07T10:51:21.717 回答