2014-11-15 40 views
1

我有一個類的結構是這樣的:期望程序員在引發異常後刪除對象是否合理?

class Server 
{ 
    private: 
    SOCKET listener; 

    public: 
    Server(char const * const address, unsigned short int port); 
    ~Server(); 
    void Start(); 
}; 

有依靠圖書館的用戶delete對象如果Start方法罰球CreateIoCompletionPortlisten在通話中說,一個異常的方法嗎?

有點主觀我知道,但是對於這種情況有沒有最佳做法?

我想要避免重複清理代碼,並可能導致雙重釋放資源的問題,並增加了複雜性,還必須跟蹤清理和不清理的內容。

編輯

要清除了一些問的問題,我指的是,當我的代碼,用戶將創建Server類的一個實例。我試圖決定是否應該通過在Start內遇到異常來保護班級在無效狀態下執行的路線。如果Start方法由於某個問題而失敗,那麼這是一個不可恢復的錯誤,並且該類處於不良狀態,並且無法繼續。這可能類似於配置錯誤或系統級錯誤,阻止Start成功,但同時使SOCKET處於無法關閉並創建新套接字的情況下無法恢復的狀態。

+2

這將是非常異常安全的代碼,是不好的做法。 – Rapptz

+4

我對你依賴用戶「刪除」的對象有點不清楚。它是「服務器」的一個實例嗎?如果是這樣,那麼確保在發生異常時不泄漏對象由用戶決定,並且他應該使用智能指針來保存「服務器」實例(假設他需要動態分配它在第一名)。 – Praetorian

+0

我知道這可能不是你想要做的,但你不必重複任何代碼;只需添加一個'Cleanup()'方法(它甚至不必是'public'),並且你的字段最初是NULL,所以你可以檢查它們是否被設置。 – andlabs

回答

4

期望程序員記得刪除他分配的所有東西,特別是在有例外的情況下是完全沒有道理的:人們可以記住的程度是有限制的,在一個足夠大的系統中,這個限制很快。

但是,刪除一切是他必須做的,以避免內存泄漏。爲了實現任何成功的程度,程序員需要做兩件事情:

  • 遵循防禦性的編碼實踐 - 喜歡在店內的自動分配給指針的對象。必須動態分配對象時使用智能指針。堅持RAII技術。
  • 編寫詳盡的單元測試,並描述它們的內存泄漏 - 使用內存分析器可以幫助您發現難以找到的泄漏。

第一部分是預防;第二部分是「安全網」。如果你有關使用智能指針和運行你的單元測試的訓練,你的代碼將在基本級別爲exception-safe(即它將提供無泄漏保證)。您可以更進一步,提前進行分配,並且只有在所有分配成功實現事務語義以實現強大的異常安全性時才更改狀態。

+0

添加一些關於「異常安全」的內容,我將其標記爲答案。基本上,這就是我一直在尋找的,並且幫助我找到了我需要的答案。這似乎是我編寫的代碼不是異常安全的,因爲對象狀態在遇到錯誤時會變得無效。在我的應用程序中調用相同的函數兩次以重新嘗試'Start'會導致不可預知的行爲。 –

相關問題