2011-09-25 48 views
2

如果我有一個功能叫我時,有我的應用程序的錯誤,我呼籲ExitProcess在該函數退出。我是否需要找到一種方法讓它可以調用諸如WSACleanup()ReleaseMutexRemoveFontMemResourceEx之類的東西,並免費獲得其他手動分配的變量?C++錯誤清理

我認爲系統自動執行此操作時,我的應用程序退出,但有一個原因,我會想反正調用這些函數清理? 如果我不這樣做,我需要甚至在我的應用程序退出之前調用它們嗎?

+0

你的問題沒有正確標記。我沒有看到與C的直接關係,另一方面,您似乎嚴重依賴於特定操作系統的特性。請糾正這一點。 –

回答

4

的標題是「C++錯誤清理的問題」,並有一個[C++]在它的標籤,所以... 爲什麼不是你的資源(內存,網絡連接,互斥體,關鍵部分等)由RAII處理?

如果你有一個錯誤,那麼拋出一個異常,如果你能處理它,就把它處理得更高一些,如果你不能(如果你不能在main中捕獲它並且退出主要優雅地與一個錯誤代碼)。

在棧展開,所有RAII保護的資源會被清除掉(所以你不會有任何資源泄漏)。

的解決方案的優點是:

  1. 你不必自己處理資源,爲RAII自動執行它。
  2. 如果有一天您認爲自己可以處理錯誤,那麼只需在您可以處理的地方捕捉異常並恢復即可。
+0

+1。當然。 – cyco130

3

大多數(所有?)現代操作系統釋放資源最多的時候一個進程退出,所以大多數的時候是安全的只是退出。但有理由明確發佈它們。

首先,如果你使用的資源泄漏檢測工具(如Valgrind的內存泄漏爲例),它要給你誤報。

其次,如果你的代碼獲取在未來的重構,你可能會忘記一些資源而造成滲漏。

所以我認爲一旦完成它們就釋放資源總是一個好主意。

+0

釋放資源對於適當的內存泄漏測試是必要的,但您並不需要它來處理出錯錯誤。 –

+0

關閉網絡連接是明智的做法。它告訴對方連接已關閉,因此可以重用端口號 –

+0

yi_H:同意,但我的其他觀點仍然存在。 Ed Heal:是的,Unix信號量是系統無法正確處理資源的另一個例子。 – cyco130

1
+0

+1表示用'atexit'註冊的函數正是我所建議的。 –

+0

......只有當您使用'ExitProcess'時,纔會工作,因爲終端將繞過CRT接線。但是,如果OP使用'ExitProcess'和更合適的'exit',這是有道理的。 – eran