checked_delete
checked_delete 在對象析構時執行一個靜態斷言,測試類是否可知,以確保析構函數被執行。checked_delete 是一個boost名字空間中的模板函數。它用于刪除動態分配的對象,對于動態分配的數組,同樣有一個稱為 checked_array_delete的模板函數。這些函數接受一個參數:要刪除的指針,或是要刪除的數組。
刪除一個動態分配的對象時,必須調用它的析構函數。如果這個類型是不完整的,即只有聲明沒有定義,那么析構函數可能會沒被調用。這是一種潛在的危險狀態,所以應該避免它。對于類模板及函數模板,風險會更大,因為無法預先知道會使用什么類型。使用 checked_delete 和 checked_array_delete, 可以解決這個刪除不完整類型的問題。它沒有運行期的額外開銷,只是直接調用 delete, 因此說 checked_delete 帶來的安全性實際上是免費的。
如果你需要在調用delete時確保類型是完整的,就使用 checked_delete 。
checked_delete 基本上就是一個判斷類是否完整的斷言,它的實現如下:
template< typename T > inline void checked_delete(T * x) {
typedef char type_must_be_complete[sizeof(T)];
delete x;
}
這里的想法是創建一個char的數組,數組的元素數量為T的大小。如果 checked_delete 被一個不完整的類型 T 所實例化,編譯將會失敗,因為 sizeof(T) 會返回 0, 而創建一個0個元素的(自動)數組是非法的。你也可以用 BOOST_STATIC_ASSERT 來執行這個斷言。
BOOST_STATIC_ASSERT(sizeof(T));
posted on 2011-07-16 16:16 Tim 閱讀(743) 評論(0) 編輯 收藏 引用 所屬分類: Boost學習