您好,登錄后才能下訂單哦!
#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 在編譯的過程中都是不會報錯的
為什么會這樣呢?
原因很簡單
一個對象,定以后,成員對象和成員方法都存放在代碼段
一旦new 出來這個對象, 其中的成員對象是跟對象本身一起存放在堆區的,
可是,成員方法(非靜態) 依然放在代碼段
所以,在析構、銷毀對象的時候,只會把堆中的東西,也就是成員對象delete掉,
所以這時候是能訪問進成員對象的
而C++這么做,是為了節省資源,畢竟相同類型的不同對象之間,可能又不同的成員對象,但它們的成員方法(非靜態)都是可以通用的
而這個問題,編譯器目前是檢查不出來的,因為編譯器查錯是在代碼執行前進行的,而這個問題是代碼執行的過程中產生的
這種問題一旦出現確實不太好找,不過歸根到底 都是水平太菜啊。。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。