關於C 物件的自殺

2021-08-25 12:34:37 字數 1030 閱讀 2304

關於c++物件的自殺

jason lee @ csdn

2010-11-05

前兩天看到乙個問題,乙個類的成員函式是否可以delete this

據出題者的意思來看,是認為這樣的問題一般比較少人會遇到,而這樣就可以了解一下對方對未知問題的分析和解決思路。

出於這點,我也想看看自己的思路,所以就先自己思考了一下。

1. 要使用delete,那麼物件需要使用new來例項化(處於堆中),而不能使用類似democls d;這樣的語句將物件放在棧中;

2. 成員函式delete this,這樣給了我一種感覺:這個成員函式是不是超出了自己的許可權呢?然而進一步想,我認為delete this純粹代表釋放this指標指向的特定大小的記憶體空間,告訴記憶體管理單元這塊記憶體區域又「自由」了;

基於以上兩點,我認為由new運算子分配空間得到的物件的成員函式可以呼叫delete this;語句。

後面在c++ faq看到該問題的闡述,原文如下:

上面提到了「自殺」時需要注意4點:

1.物件是通過最簡單的new運算子分配到空間的,而非new,也不是記憶體定位的new(比如new(p) q),更不是棧上面的、全域性的,最後該物件不能是另外乙個物件的成員;

2.負責自殺的成員函式應該是該物件最後呼叫的成員函式;

3.負責自殺的成員函式在delete this;這一條語句後面不能再去訪問物件的其它成員;

4.物件自殺後,不能再去訪問this指標;

最後說明了一句,如果this指標指向乙個不具有虛析構函式的基類物件,往往會出現警告。

對於上面要注意的4點,有的即使不遵守也不會出現警告或者錯誤,但是會有安全隱患。因為delete this;語句得到呼叫後,指向該物件的指標就是野指標了,這時候記憶體中的內容可能保持完整並且可以被訪問,使得資料仍然有效,但是安全的編碼風格應該保證記憶體釋放後不能再對它進行訪問,避免潛在風險。

讓C 物件自殺

今天檢測記憶體洩露,有類似如下 1 classa2 8 a 912 private 13 inta 14 1516 class b publica17 23 b 2427 private 28 intb 29 3031 32int main int argc,tchar ar 33執行的結果是 cr...

delete this 物件請求自殺

第一次見delete this的時候,沒覺得這是一項會有什麼特殊作用的技術,因此也就沒有特別關注。昨日在source com上看state模式之c 實現的時候,看到它在狀態轉換的時候使用了delete this,感覺似乎還不錯。作為一種 禁術 使用的時候必須要相當小心才行,c faq 裡提到所謂 小...

C中的自殺函式和C 中的自殺類

今天看glibc 2.7的記憶體分配 注意到乙個詭異現象 某函式的指標自我清空。也就是說,此函式指標只能用一次。具體說來就是指向函式malloc hook ini的函式指標 malloc hook。於是自己嘗試了一下這類函式的寫法。function suicide int testfunction ...