In order to understand "delete this" :
First Step------dive into "delete p"
delete p 執(zhí)行了哪兩個(gè)步驟?
delete p 是一個(gè)兩步的過程:調(diào)用析構(gòu)函數(shù),然后釋放內(nèi)存。delete p產(chǎn)生的代碼看上去是這樣的(假設(shè)是Fred*類型的):
// 原始碼:delete p;
if (p != NULL)
{
p->~Fred();
operator delete(p);
}
p->~Fred() 語句調(diào)用 p 指向的Fred 對(duì)象的析構(gòu)函數(shù)。
operator delete(p) 語句調(diào)用內(nèi)存釋放原語 void operator delete(void* p)。
Second Step-------"delete this"
成員函數(shù)調(diào)用delete this合法嗎?
只要你小心,一個(gè)對(duì)象請(qǐng)求自殺(delete this),是可以的。
以下是我對(duì)“小心”的定義:
你必須100%的確定,this對(duì)象是用 new分配的(不是用new[],也不是用定位放置 new,也不是一個(gè)棧上的局部對(duì)象,也不是全局的,也不是另一個(gè)對(duì)象的成員,而是明白的普通的new)。
你必須100%的確定,該成員函數(shù)是this對(duì)象最后調(diào)用的的成員函數(shù)。
你必須100%的確定,剩下的成員函數(shù)(delete this之后的)不接觸到 this對(duì)象任何一塊(包括調(diào)用任何其他成員函數(shù)或訪問任何數(shù)據(jù)成員)。
你必須 100%的確定,在delete this之后不再去訪問this指針。換句話說,你不能去檢查它,將它和其他指針比較,和 NULL比較,打印它,轉(zhuǎn)換它,對(duì)它做任何事。
自然,對(duì)于這種情況還要習(xí)慣性地告誡:當(dāng)你的指針是一個(gè)指向基類類型的指針,而沒有虛析構(gòu)函數(shù)時(shí)(也不可以 delete this)。
注意:因?yàn)槭窃陬惓蓡T函數(shù)里面delete this的,所以在此語句以后,不能訪問任何的成員變量及虛函數(shù),否則一定非法。