成員函式呼叫delete this的問題

2021-08-11 03:54:05 字數 717 閱讀 2856

有如下程式,那麼會有什麼樣的結果?程式會崩潰麼?

結果:程式執行正常,設定fun2也能夠正常執行,以下是列印出來的結果,

分析:根本原因在於記憶體模型。物件裡只存有資料成員跟虛函式指標(如果有的話),而**內容則是單獨存在在另外的地方。在呼叫成員函式的時候,都會隱含傳遞乙個this指標,目的是讓當前函式知道是哪個物件在呼叫它。

雖然 delete之後,類物件被釋放掉,但是只要在函式內不涉及到物件的資料或者不是呼叫虛函式,那麼還是可以正常執行。否則會有不可預期的問題?為什麼不是指標錯誤,或者無訪問許可權令系統崩潰的問題呢?因為釋放掉的記憶體空間並不是立刻被**的,所以有可能還是可以訪問的,只是值是不確定的。當訪問資料成員的時候,可能得到一串未初始化的隨機數,訪問虛函式表,有可能是指標無效從而系統崩潰。

另外,為什麼這裡fun裡delete了後,當t退出的時候,沒有導致第二次delete呢?從結果可以看到,當在fun裡delete了後,就已經呼叫了析構函式,所以後面當t出作用域的時候,不會再次析構,所以程式執行正常。

最後,如果在析構函式裡delete this呢?棧溢位。因為delete本身就會呼叫析構函式然後釋放記憶體,所以就會無限遞迴下去,從而棧溢位。

成員函式呼叫虛函式

在乙個基類或派生類的成員函式中可以直接呼叫該類等級中的虛函式,例如 class a void act2 virtual void act3 virtual void act4 void act5 void act4 void act5 在上例情況下,this指向b,所以a act2 呼叫b act3...

類成員函式呼叫

大家都知道c 的虛函式前必須加virtual,但如果一連串的繼承下來,有的忘了加virtual會出現什麼情況呢?為了滿足我的好奇心,做了點實驗然後有了本文,僅僅是好玩,沒有啥實際意義。本文只給出vs2005的情況 首先,如果是單一類,沒加virtual的話那麼好辦,直接call a fun,非sta...

空指標的成員函式呼叫

自 http hi.baidu.com sangwf blog item 0be10af482d0c46edcc47464.html 我一直認為技術是沒有止境的,不管你怎麼去學,總有你沒有掌握的地方。但是,人,是不能停下腳步的。今天在檢查乙個mfc程式,看到getsafehwnd函式,於是讓我想明白...