在類的成員函式中能不能呼叫delete this?

2021-10-06 13:03:25 字數 1073 閱讀 3468

如圖:

解析:1.在類的成員函式中能不能呼叫delete this?答案是肯定的,能呼叫,而且很多老一點的庫都有這種**。假設這個成員函式名字叫release,而delete this就在這個release方法中被呼叫,那麼這個物件在呼叫release方法後,還能進行其他操作,如呼叫該物件的其他方法麼?答案仍然是肯定 的,呼叫release之後還能呼叫其他的方法,但是有個前提:被呼叫的方法不涉及這個物件的資料成員和虛函式。

2.根本原因在於delete操作符的功能和類物件的記憶體模型。當乙個類物件宣告時,系統會為其分配記憶體空間。在類物件的記憶體空間中,只有資料成員和虛函式表指標,並不包含**內容,類的成員函式單獨放在**段中。在呼叫成員函式時,隱含傳遞乙個this指標,讓成員函式知道當前是哪個物件在呼叫它。當 呼叫delete this時,類物件的記憶體空間被釋放。在delete this之後進行的其他任何函式呼叫,只要不涉及到this指標的內容,都能夠正常執行。一旦涉及到this指標,如運算元據成員,呼叫虛函式等,就會出現不可預期的問題。

3.為什麼是不可預期的問題?delete this之後不是釋放了類物件的記憶體空間了麼,那麼這段記憶體應該已經還給系統,不再屬於這個程序。照這個邏輯來看,應該發生指標錯誤,無訪問許可權之類的令系統崩潰的問題才對啊?這個問題牽涉到作業系統的記憶體管理策略。delete this釋放了類物件的記憶體空間,但是記憶體空間卻並不是馬上被**到系統中,可能是緩衝或者其他什麼原因,導致這段記憶體空間暫時並沒有被系統收回。此時這段記憶體是可以訪問的,你可以加上100,加上200,但是其中的值卻是不確定的。當你獲取資料成員,可能得到的是一串很長的未初始化的隨機數;訪問虛函式表,指標無效的可能性非常高,造成系統崩潰。

4.如果在類的析構函式中呼叫delete this,會發生什麼?實驗告訴我們,會導致堆疊溢位。原因很簡單,delete的本質是「為將被釋放的記憶體呼叫乙個或多個析構函式,然後,釋放記憶體」 (來自effective c++)。顯然,delete this會去呼叫本物件的析構函式,而析構函式中又呼叫delete this,形成無限遞迴,造成堆疊溢位,系統崩潰。

子類能不能繼承父類的成員變數

1 關於私有成員變數 無論父類中的成員變數是私有的 共有的 還是其它型別的,子類都會擁有父類中的這些成員變數。但是父類中的私有成員變數,無法在子類中直接訪問,必須通過從父類中繼承得到的protected public方法 如getter setter方法 來訪問。2 關於靜態成員變數 無論父類中的成...

能不能在建構函式和析構函式中呼叫虛函式?

可以,但是達不到想要的效果,應該盡可能避免在建構函式和析構函式中呼叫虛函式。class base public base cout 當定義乙個derived例項物件時,在base的建構函式中呼叫size 會被靜態的決議為base size 而不是derived size 可以這麼理解,當在構造bas...

C 中, 建構函式和析構函式能不能被顯示呼叫

include using namespace std class a a int ix a int main 輸出 default constructor is called.1 default constructor is called.2 another constructor is call...