C ++错误清理

时间:2011-09-25 13:27:37

标签: c++ windows memory-management

如果我有一个函数,我在我的应用程序出错时调用,并在该函数中调用ExitProcess退出。我是否需要找到一种方法让它调用WSACleanup()ReleaseMutex以及RemoveFontMemResourceEx等内容,并释放其他手动分配的变量?

我相信系统会在我的应用程序退出时自动执行此操作,但是有什么理由我还想调用这些清理功能吗? 如果我不这样做,我是否需要在我的申请退出之前立即打电话给他们?

3 个答案:

答案 0 :(得分:4)

标题是“C ++错误清理问题”,上面有一个[c ++]标签,所以... 为什么不是你的资源(内存,网络连接,互斥,关键部分等)。 )由RAII处理?

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

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

解决方案的优点是:

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

答案 1 :(得分:3)

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

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

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

所以我认为在你完成资源后尽快发布资源总是一个好主意。

答案 2 :(得分:1)