2012-10-06 24 views
2

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

一样的问题:

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

当然,我在运行时会释放不需要的块。在正常的终止之前,我确实释放了所有的东西 - 这样内存泄漏检查器就不会给我带来误报(如果需要进行重大的重构,请灵活处理)。

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

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

回答

2

我的口头禅,(甚至是异常终止)这一切“正常终止免费一切”拿,是,通常情况下,下行空间远远大于上行:

1)操作系统已alreday设计,测试并由数十亿用户进行浸泡测试。在停止任何内核上的任何状态的每个线程之后,它可以轻松释放所有剩余分配的内存。你可以用你的用户代码来做到这一点 - 不。

2)您必须添加代码才能执行此操作。每次添加代码时,都可能会添加更多的错误。试图在繁忙的复杂环境中释放所有分配的内存,多线程系统是一场噩梦,除非你是一个操作系统。内存遍布整个地方,在线程变量,队列等中,可能或可能不会被一个或多个线程访问。所有权不确定且不断变化。你会怎么做?

3)您必须不断测试和扩展您的关机系统,以确保在更改/增强/升级后释放所有内存。 4)不断检查线程中的“终止”标志等,以便线程可以在关闭时释放一些内存,这是额外的开销。

5)许多库在关闭时并不释放所有内存。如果图书馆是不透明/半透明的,你可能无法做任何事情。

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

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

8)过滤并计数SO re上的所有线程。 '无法阻止我的线程关闭我的应用程序'。

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

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

相关问题