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