關於delete野指針沒有崩潰的神奇bug

前言

最近遇到一個神奇的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(*^▽^*)

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