【ZT】delete this的使用

【ZT】delete this的使用


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的,所以在此語句以後,不能訪問任何的成員變量及虛函數,否則一定非法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章