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