delete
this--對(duì)象請(qǐng)求自殺
版本:0.1
最后修改:2009-08-18
撰寫(xiě):李現(xiàn)民
第一次見(jiàn)delete
this的時(shí)候,沒(méi)覺(jué)得這是一項(xiàng)會(huì)有什么特殊作用的技術(shù),因此也就沒(méi)有特別關(guān)注。
昨日在sourcemaking.com上看state模式之c++實(shí)現(xiàn)的時(shí)候,看到它在狀態(tài)轉(zhuǎn)換的時(shí)候使用了delete
this,感覺(jué)似乎還不錯(cuò)。
作為一種“禁術(shù)”,使用的時(shí)候必須要相當(dāng)小心才行,《C++
FAQ》里提到所謂“小心”至少包括以下幾個(gè)方面:
-
this對(duì)象是必須是用
new操作符分配的(而不是用new[],也不是用placement
new,也不是局部對(duì)象,也不是global對(duì)象);
-
delete
this后,不能訪問(wèn)該對(duì)象任何的成員變量及虛函數(shù)(delete
this回收的是數(shù)據(jù),這包括對(duì)象的數(shù)據(jù)成員以及vtable,不包括函數(shù)代碼);
-
delete
this后,不能再訪問(wèn)this指針。換句話說(shuō),你不能去檢查它、將它和其他指針比較、和
NULL比較、打印它、轉(zhuǎn)換它,以及其它的任何事情;
個(gè)人認(rèn)為保證以上禁忌列表基本手段可以包括:
-
將析構(gòu)函數(shù)私有化(如果有子類(lèi),則protected化,保證子類(lèi)能夠正確繼承)--以保證對(duì)象必須使用new在堆上分配內(nèi)存;
-
提供(可以在僅僅在基類(lèi)中)Destroy(void)函數(shù),里面僅有一句delete
this--以保證第三方能夠?qū)⒎峙涞膬?nèi)存回收;
下一次使用state
pattern的時(shí)候,我想可以嘗試一下。