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