我的口头禅,(甚至是异常终止)这一切“正常终止免费一切”拿,是,通常情况下,下行空间远远大于上行:
1)操作系统已alreday设计,测试并由数十亿用户进行浸泡测试。在停止任何内核上的任何状态的每个线程之后,它可以轻松释放所有剩余分配的内存。你可以用你的用户代码来做到这一点 - 不。
2)您必须添加代码才能执行此操作。每次添加代码时,都可能会添加更多的错误。试图在繁忙的复杂环境中释放所有分配的内存,多线程系统是一场噩梦,除非你是一个操作系统。内存遍布整个地方,在线程变量,队列等中,可能或可能不会被一个或多个线程访问。所有权不确定且不断变化。你会怎么做?
3)您必须不断测试和扩展您的关机系统,以确保在更改/增强/升级后释放所有内存。 4)不断检查线程中的“终止”标志等,以便线程可以在关闭时释放一些内存,这是额外的开销。
5)许多库在关闭时并不释放所有内存。如果图书馆是不透明/半透明的,你可能无法做任何事情。
6)如果一个线程抛出一个严重的异常,内存可能处于这样一种状态,试图从用户代码中释放它将导致其他线程中出现更多异常。
7)风险/回报 - 很好,干净Valgrind输出与来自客户的电话/电子邮件嘿,你的应用程序有时不会关闭,我们必须调用管理员来kill-9/TaskManager它。
8)过滤并计数SO re上的所有线程。 '无法阻止我的线程关闭我的应用程序'。
对于一些应用程序,一些线程可能不得不以结构化方式终止正常关机,例如,提交和关闭数据库连接,刷新和关闭文件。释放内存不属于该类别,即使是正常关机。
如果您的应用程序确实存在严重问题,那么您不应该尝试“清理”内存 - 您的应用程序已经脏了,需要报废并用新实例替换。