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