2014-10-29 82 views
-1

在C++中,如果非RAII類具有用戶定義的析構函數,那麼它是一個好設計嗎?非RAII類是否需要用戶定義的析構函數?

+1

什麼是非RAII類? – juanchopanza 2014-10-29 13:21:22

+0

好的,說RAII我是指類的主要目標是獲取和釋放資源。非RAII類是一個有其他目標的類。 – 2014-10-29 13:25:59

+0

不知道我明白..你能用這樣的代碼做一個這樣的類的例子嗎? – 2014-10-29 13:26:57

回答

0

如果類不需要釋放任何資源(或執行任何操作),並且不需要爲虛擬函數表創建空的析構函數,那麼最好不要定義析構函數在所有(見零規則)。

1

有兩個常見的「經驗法則」涵蓋了這一點。

第一個是五法則(在C++ 03中,規則三,因爲沒有任何移動)。如果您有複製構造函數,複製賦值運算符,析構函數,移動構造函數或移動賦值運算符中的任何一個,則需要編寫或阻止其他每個運算符。

第二是規則零,其中指出,對於大多數類,不寫一個拷貝構造函數,拷貝賦值運算符,析構函數,構造運動或移動賦值操作符。相反,請將您的資源存儲在爲您處理該問題的特殊用途子對象中。

規則爲零可能是你所指的。

與大多數經驗法則一樣,這不是一條硬性規則,但它背後有智慧。一個工作是資源管理(你可能稱之爲RAII類)的類可以處理問題的來龍去脈,而不用關心其餘的邏輯,通常是以零開銷的方式做到這一點。然後你的外部類可以免除這種擔憂。由於資源壽命管理是一個不平凡的問題,將其與其他問題隔離並單獨進行測試可以幫助減少錯誤。但是,如果您的對象旨在從多態繼承,它通常需要一個虛擬析構函數。它應該也可以阻止賦值,複製構造(至少公開),移動構造,移動賦值和複製賦值,至於多態類,這些很少有意義,並且可能導致切片問題。

擁有用戶定義的析構函數的另一個原因是,如果你正在編寫一個範圍守護類,它往往不擁有任何資源。正確地執行一個範圍守衛類是棘手的(並且如果沒有新的C++異常展開檢測支持 - 基本上確定一個範圍守護類是否可以安全拋出幾乎是不可能的)。

相關問題