為什么delete之后的對象指針還能跑它的函數?


為什么在下面的代碼中:aFun()這個函數里頭在delete之后,tempclass->show();還能好好的跑,為什么程序沒有崩潰?傳說內存不是被回收了嘛!?

class tempClass
{
public:
tempClass(){cout << "tempClass initial..." << endl;}
~tempClass(){cout << "tempClass Deinitial..." << endl;}
void show(){cout << "tempClass Showing..." << endl;}
};


tempClass* aFun()
{
tempClass *tempclass = new tempClass;
cout << tempclass << endl;
delete tempclass;
tempclass->show();
return tempclass;
}

void main()
{
   tempClass* tclass = aFun();
   cout << tclass << endl;
   tclass->show();
}

16 个解决方案

#1


沒被覆蓋的時候是不會出錯的

#2


((tempClass*)0)->show();//你還可以這樣。這沒什么奇怪的,只是你調用的函數沒用到數據成員而已。

#3


見樓上

#4


引用 2 樓 pengzhixi 的回復:
((tempClass*)0)->show();//你還可以這樣。這沒什么奇怪的,只是你調用的函數沒用到數據成員而已。


為什么((tempClass*)0)->show();可以呢?請說明一下,謝謝~~~

#5


實際上只要你分配的那塊內存沒有被重新覆蓋的話,即使訪問了數據成員也不見得會報錯。不過不建議這么用。我那個只是用來做做例子。不提倡這么用。

#6


函數的存在是和實例沒關系的,一個函數如果沒有訪問非靜態的成員,那么可以只通過函數地址來調用這個函數,從而,你的show()根本就沒有訪問類的成員,如果你的類再加入一個聲明:int i;
然后修改show()

void show(){cout << "tempClass Showing..." << ++i<< endl;}

這時再編譯,看還能通過嗎?

#7


因為樓主人品好。
只是出來混,不會一直人品好,遲早要還的。
所以,別寫這些依賴人品的代碼。

#8


引用 6 樓 lianshaohua 的回復:
函數的存在是和實例沒關系的,一個函數如果沒有訪問非靜態的成員,那么可以只通過函數地址來調用這個函數,從而,你的show()根本就沒有訪問類的成員,如果你的類再加入一個聲明:int i;
然后修改show()

void show(){cout << "tempClass Showing..." <<++i<< endl;}

這時再編譯,看還能通過嗎?


引用 5 樓 pengzhixi 的回復:
實際上只要你分配的那塊內存沒有被重新覆蓋的話,即使訪問了數據成員也不見得會報錯。不過不建議這么用。我那個只是用來做做例子。不提倡這么用。


我試着增加了一個成員(int型)(在構造中初始化為13,在show里面使用這個成員,delete之后函數能調用,但成員的值發生了比變化(指向了內存某個默認的值)

#9


實驗下來,比較符合#6樓的觀點。函數的存在是和實例沒關系
我想問問,那么,沒有使用到任何成員變量的,為什么為什么((tempClass*)0)->show();可以呢?
這個show()到底放在了哪里呢?

#10


((tempClass*)0)->show();

#11


((tempClass*)0)->show();
//這就是取類tempClass的函數show()的地址,然后編譯器會做轉換
tempClass::show(this,其它參數);
而你的this在這里為0即null,而你的show()里沒有用到類成員的任何數據,所以就調用了類tempClass的show()函數;

你也提到delete后,你的數據成員發生了變化,你再試一次:delete你的類實例,然后把實例指針賦值為0,再試試還能不能成功;

#12


我是來學習的。

#13


引用 9 樓 nasa_cj 的回復:
實驗下來,比較符合#6樓的觀點。函數的存在是和實例沒關系
我想問問,那么,沒有使用到任何成員變量的,為什么為什么((tempClass*)0)->show();可以呢?
這個show()到底放在了哪里呢?


你這個在仔細體味下我上面說的吧。

#14


就像7L說的不要寫依賴人品的代碼

#15


表示對6樓所說的問題不是太清楚可以用代碼來解釋下么?

#16


個人覺得你應該了解下,delete到底做了什么?
其實它只是告訴大家,你前面通過new得到的內存現在已經不屬於你了,但是它的內容暫時不會改變,
直到當別人申請內存時,這塊內存被分配給它,然后它改變內存內容時,內存的內容才改變。

當你把內存delete了,也就時告訴系統你不要了以后,然后你又使用它,這是很危險的,有可能你會
改變別人的內存內容。

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com