前言
最近遇到一個神奇的bug:delete野指針沒有崩潰。
解決過程
查了很多資料,大致意思是c++沒有定義delete野指針的行爲,所以delete野指針的行爲不可定義,即有可能崩潰也有可能不崩潰。
印象比較深刻的一個比喻是:
指針指向的內存相當於房間,指針相當於鑰匙,當你delete指針就相當於退房,但是由於沒有置指針爲空(此時該指針就變成野指針),就相當於你還有這個房間的鑰匙。但是房東只知道你退房了,不知道你還有鑰匙,所以他可能動了房間裏面的東西,所以再次引用野指針就會有問題(畢竟結構內容都不一樣了)。但是這個房間也有可能給另外一個房客使用,這時候你再使用這個鑰匙打開這個房間,該房東可能很憤怒揍你,房東也有可能覺得不是啥大事,就這麼算了。房東就相當於編譯器,delete野指針會產生什麼結果是由編譯器定義的。
因此我試驗了vs2008和vs2019兩個編譯環境,在這兩個環境中編譯相同的代碼:
#include <iostream>
int main()
{
int* pTmp = new int;
*pTmp = 4;
delete pTmp;
// 此時的pTmp爲野指針,因爲裏面的內容已經銷燬掉了,但是pTmp不爲空
delete pTmp;
}
vs2008的運行情況:
vs2019運行情況:
vs2019直接崩潰了
總結
delete野指針行爲未定義,是否會崩潰看編譯器咋整,但是不管是否崩潰,退房後就要還鑰匙,即delete後要把指針置爲空,這纔是好的編程習慣~d(*^▽^*)