用Windows系統(tǒng)的朋友可能都碰到過這個(gè)報(bào)錯(cuò):
「0X????????指令引用了0x00000000內(nèi)存,該內(nèi)存不能為read或written」,然后程序直接崩潰。
你要是去問所謂的高手,基本都會(huì)聽到一句:Windows就這樣,垃圾系統(tǒng)唄。
但其實(shí)這鍋不一定全是Windows背的,下面咱就簡(jiǎn)單聊聊這種錯(cuò)誤到底是怎么回事。
第一種情況:程序沒做內(nèi)存檢查
程序運(yùn)行時(shí)需要用到內(nèi)存,這時(shí)候就會(huì)調(diào)系統(tǒng)函數(shù)來申請(qǐng)一塊空間。
如果分配成功,系統(tǒng)會(huì)返回一個(gè)地址給程序,程序就能用這塊內(nèi)存了;
但如果失敗了,系統(tǒng)就會(huì)返回0,表示沒地方給你用了。
這個(gè)時(shí)候,程序應(yīng)該知道自己申請(qǐng)失敗了,得做一些處理,比如提示用戶或者自己暫停一下。
但如果程序員疏忽了,沒有寫檢查代碼,那程序就會(huì)傻乎乎地繼續(xù)往下跑,以為0這個(gè)地址是合法的。
而實(shí)際上,0地址那一塊內(nèi)存是系統(tǒng)核心數(shù)據(jù),比如中斷描述符表,是絕對(duì)不允許隨便訪問的。
在老系統(tǒng)(比如DOS)里亂動(dòng)這個(gè)地方,電腦立馬藍(lán)屏死機(jī);
而在現(xiàn)代系統(tǒng)像Windows里,會(huì)有保護(hù)機(jī)制,直接把出錯(cuò)程序咔嚓掉,防止影響整個(gè)系統(tǒng)。
于是你就看到了那個(gè)經(jīng)典的內(nèi)存讀寫錯(cuò)誤,地址就是0x00000000。
造成這種情況的原因有很多,比如內(nèi)存不夠、系統(tǒng)版本不匹配、后臺(tái)程序太多等等。
尤其是當(dāng)你用了一段時(shí)間的電腦,裝了很多軟件,甚至不小心中了病毒之后,這類問題更容易出現(xiàn)。
第二種情況:程序自己有BUG,用了不該用的內(nèi)存地址
有些時(shí)候,程序本來以為某個(gè)地址是可以讀寫的,但實(shí)際上已經(jīng)出了問題。
比如內(nèi)存已經(jīng)被釋放了,但程序還在試圖訪問;或者指針被錯(cuò)誤賦值,指向了非法區(qū)域。
這時(shí)候也會(huì)觸發(fā)類似的問題,報(bào)出不能讀寫的錯(cuò)誤信息。
這種錯(cuò)誤大多數(shù)時(shí)候還是程序自身的問題,而不是Windows系統(tǒng)太爛。
當(dāng)然啦,誰還沒寫個(gè)bug?程序員也不是神嘛~
「0X????????指令引用了0x00000000內(nèi)存,該內(nèi)存不能為read或written」,然后程序直接崩潰。
你要是去問所謂的高手,基本都會(huì)聽到一句:Windows就這樣,垃圾系統(tǒng)唄。
但其實(shí)這鍋不一定全是Windows背的,下面咱就簡(jiǎn)單聊聊這種錯(cuò)誤到底是怎么回事。
第一種情況:程序沒做內(nèi)存檢查
程序運(yùn)行時(shí)需要用到內(nèi)存,這時(shí)候就會(huì)調(diào)系統(tǒng)函數(shù)來申請(qǐng)一塊空間。
如果分配成功,系統(tǒng)會(huì)返回一個(gè)地址給程序,程序就能用這塊內(nèi)存了;
但如果失敗了,系統(tǒng)就會(huì)返回0,表示沒地方給你用了。
這個(gè)時(shí)候,程序應(yīng)該知道自己申請(qǐng)失敗了,得做一些處理,比如提示用戶或者自己暫停一下。
但如果程序員疏忽了,沒有寫檢查代碼,那程序就會(huì)傻乎乎地繼續(xù)往下跑,以為0這個(gè)地址是合法的。
而實(shí)際上,0地址那一塊內(nèi)存是系統(tǒng)核心數(shù)據(jù),比如中斷描述符表,是絕對(duì)不允許隨便訪問的。
在老系統(tǒng)(比如DOS)里亂動(dòng)這個(gè)地方,電腦立馬藍(lán)屏死機(jī);
而在現(xiàn)代系統(tǒng)像Windows里,會(huì)有保護(hù)機(jī)制,直接把出錯(cuò)程序咔嚓掉,防止影響整個(gè)系統(tǒng)。
于是你就看到了那個(gè)經(jīng)典的內(nèi)存讀寫錯(cuò)誤,地址就是0x00000000。
造成這種情況的原因有很多,比如內(nèi)存不夠、系統(tǒng)版本不匹配、后臺(tái)程序太多等等。
尤其是當(dāng)你用了一段時(shí)間的電腦,裝了很多軟件,甚至不小心中了病毒之后,這類問題更容易出現(xiàn)。
第二種情況:程序自己有BUG,用了不該用的內(nèi)存地址
有些時(shí)候,程序本來以為某個(gè)地址是可以讀寫的,但實(shí)際上已經(jīng)出了問題。
比如內(nèi)存已經(jīng)被釋放了,但程序還在試圖訪問;或者指針被錯(cuò)誤賦值,指向了非法區(qū)域。
這時(shí)候也會(huì)觸發(fā)類似的問題,報(bào)出不能讀寫的錯(cuò)誤信息。
這種錯(cuò)誤大多數(shù)時(shí)候還是程序自身的問題,而不是Windows系統(tǒng)太爛。
當(dāng)然啦,誰還沒寫個(gè)bug?程序員也不是神嘛~