91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++ 銷毀一個自定義對象后,它里面的成員方法去哪兒了?

發布時間:2020-07-02 20:34:06 來源:網絡 閱讀:445 作者:shangluyi 欄目:編程語言
#include <iostream>
using namespace std;

class TestClass
{
public:
	void Print()
	{
		cout << "hello" << endl;
		//_a++;
	}

protected:
	//int _a = 0;
};

int main()
{
	TestClass *tc = new TestClass();
	delete tc;
	tc = NULL;
	tc->Print();
	return 0;
}

類似如上模型的代碼 坑了我好久

下面是我今天下午的遭遇:


注意main函數中,我首先申請了一塊 tc類型的對象

緊接著我把它delete 并將指向它的指針置為NULL了  

然而這時候,執行 tc->Print()  是可以的,程序可以輸出 hello 

但如果緊接著將代碼中的2行注釋放開,也就是在類中定義一個成員對象a,并在成員方法Print中訪問這個對象,程序立馬掛掉,而這不論是g++ 還是 Visual Studio 在編譯的過程中都是不會報錯的


為什么會這樣呢?

原因很簡單

C++  銷毀一個自定義對象后,它里面的成員方法去哪兒了?

一個對象,定以后,成員對象和成員方法都存放在代碼段

一旦new 出來這個對象, 其中的成員對象是跟對象本身一起存放在堆區的,

可是,成員方法(非靜態) 依然放在代碼段

所以,在析構、銷毀對象的時候,只會把堆中的東西,也就是成員對象delete掉,

所以這時候是能訪問進成員對象的


而C++這么做,是為了節省資源,畢竟相同類型的不同對象之間,可能又不同的成員對象,但它們的成員方法(非靜態)都是可以通用的


而這個問題,編譯器目前是檢查不出來的,因為編譯器查錯是在代碼執行前進行的,而這個問題是代碼執行的過程中產生的


這種問題一旦出現確實不太好找,不過歸根到底 都是水平太菜啊。。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永昌县| 东乡县| 漳平市| 台东市| 东辽县| 冀州市| 东乌珠穆沁旗| 恩平市| 磐安县| 白沙| 桂东县| 获嘉县| 女性| 巴青县| 冷水江市| 阜阳市| 西乡县| 彰武县| 田东县| 晋城| 海盐县| 象州县| 亚东县| 瓦房店市| 色达县| 子洲县| 大兴区| 庄河市| 东丽区| 陵川县| 大同市| 长兴县| 梅河口市| 扬州市| 康平县| 屏东县| 铜川市| 商水县| 徐水县| 云安县| 卢氏县|