【问题标题】:C++ error cleanupC++ 错误清理
【发布时间】:2011-09-25 13:27:36
【问题描述】:

如果我有一个函数,我会在我的应用程序出现错误时调用,然后在该函数中调用 ExitProcess 以退出。我是否需要找到一种方法让它调用诸如 WSACleanup()ReleaseMutexRemoveFontMemResourceEx 之类的东西,并释放其他手动分配的变量?

我相信系统会在我的应用程序退出时自动执行此操作,但是我是否有理由仍然要调用这些清理函数? 如果我不这样做,我是否需要在我的应用程序退出之前调用它们?

【问题讨论】:

  • 您的问题未正确标记。我看不到与 C 的直接关系,另一方面,您似乎严重依赖特定操作系统的特性。请更正。

标签: c++ windows memory-management


【解决方案1】:

标题是“C++错误清理问题”,上面有一个[c++]标签,所以... 为什么你的资源(内存、网络连接、互斥锁、临界区等)没有) 由RAII处理?

如果你有一个错误,然后抛出一个异常,如果你能处理它就在堆栈上处理它,如果你不能让它崩溃应用程序(或者在主程序中捕获它,然后优雅地退出主程序带有错误代码)。

在堆栈展开时,您所有受 RAII 保护的资源都将被清除(因此您不会有任何资源泄漏)。

该方案的优点是:

  1. 您不必自己处理资源,因为 RAII 会自动处理。
  2. 如果有一天您相信自己可以处理错误,只需在可以处理的地方捕获异常并恢复即可。

【讨论】:

    【解决方案2】:

    大多数(全部?)现代操作系统在进程退出时会释放大部分资源,因此大多数时候退出是安全的。但是有理由明确发布它们。

    首先,如果您使用资源泄漏检测工具(例如用于内存泄漏的 valgrind),它会给您带来误报。

    其次,如果你的代码在未来被重构,你可能会忘记一些资源,导致泄漏。

    所以我认为一旦你完成资源就释放它们总是一个好主意。

    【讨论】:

    • 释放资源对于正确的内存泄漏测试是必要的,但对于错误处理退出你并不需要它。
    • 明确地关闭网络连接是个好主意。它告诉对方连接已关闭,因此能够重用端口号
    • yi_H:同意,但我的另一点仍然成立。 Ed Heal:是的,Unix 信号量是系统未正确处理资源的另一个例子。
    • @Ed Heal:如果您不明确关闭它,操作系统会这样做。
    【解决方案3】:

    【讨论】:

    • +1 建议使用atexit 注册的函数正是我要建议的。
    • ...只有在您使用ExitProcess 时才行不通,因为终端将绕过 CRT 接线。但是,如果 OP 出于这个确切原因将 ExitProcess 的使用替换为更合适的 exit,那将是有意义的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    相关资源
    最近更新 更多