delete this的問題

在複習this指針部分時,遇到了一個常考的面試題

class A
{
	public:
		~A()
		{
			delete this;
		}
};

請問這段代碼會出現什麼問題,首先我們可以從兩部分來分析:
在編譯階段,他沒有任何語法問題,編譯通過;但是在運行階段,代碼會崩潰,因爲在類的析構函數中調用delete this,delete this本身會調用本對象的析構函數,而析構函數中又調用delete this,形成無限遞歸,造成堆棧溢出,系統崩潰;
出現崩潰的根本原因在於delete操作符的功能和類對象的對象模型,當一個類對象聲明時,系統會爲其分配內存空間,delete調用析構函數,清理對象中的資源,釋放指針所指向的堆空間;
值得注意的是,在delete this之後的其他任何的函數調用,只要不涉及到this指針的內容,都能夠正常運行,一旦涉及到this指針,如操作數據成員,調用虛函數等,就會出現不可預期的問題。

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