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