該內存不(bú)能為“read”的原因是什麽
該(gāi)內存不能(néng)為“read”的(de)原因是在是(shì)太(tài)多太多了,隻要是Windows係統,隻(zhī)要是(shì)X86或者現在(zài)64位也不例外,都會(huì)出(chū)現這種問(wèn)題.這是(shì)一個(gè)BUG或者是文件錯誤導致.
運(yùn)行某些程序的時候,有時會出現(xiàn)內存(cún)錯誤的提示,然後該程序就關閉。
“0x????????”指令引(yǐn)用的“0x????????”內存。該內(nèi)存不能為“read”。
“0x????????”指令(lìng)引用的“0x????????”內存,該內存不能為“written”。
不知你出現過類似(sì)這樣的故障嗎?(0x後麵(miàn)內容有可能不(bú)一樣。)
一般出現這個現象有方麵的,一是(shì)硬件,即內存方麵有問題,二是(shì)軟(ruǎn)件,這就有多(duō)方(fāng)麵的問題了。
1、微(wēi)軟IE緩衝溢出漏洞(dòng)引起(qǐ)
2、內存或(huò)虛(xū)擬內存地址使(shǐ)用衝突造成
程序(xù)的運行需要分配(pèi)一定的內存(cún)地址給程序使用(yòng),當程序結束時釋放留出空間(jiān)讓給新的程序使用,win是多任務的係(xì)統 有時(shí)前程序(xù)未結束 又(yòu)有新(xīn)的任務開始 到底要多少內存或虛擬內存來保證我們同時(shí)運行的工作任務呢?也許win在這個問(wèn)題上沒弄(nòng)好,所以有此錯誤常常發生(shēng),一般運行大型軟(ruǎn)件或(huò)多媒(méi)體後(hòu)出現這種情況
3、劣質內存條也(yě)會出現這個問(wèn)題
一般(bān)來說,內存出現問題(tí)的可(kě)能性並不大,主(zhǔ)要(yào)方(fāng)麵是:內存條壞了、內存(cún)質量有問題,還有就是(shì)2個(gè)不同牌子不同容量(liàng)的(de)內存混(hún)插,也比較容易(yì)出現不兼(jiān)容(róng)的情況(kuàng),同時還要注意散熱問題,特別(bié)是超(chāo)頻後。你可以使(shǐ)用(yòng)MemTest 這個軟件(jiàn)來檢(jiǎn)測一下(xià)內存,它可(kě)以徹底的(de)檢測出內存的穩定度。
假如你是雙內存,而且(qiě)是不(bú)同(tóng)品牌的內存條混(hún)插或(huò)者買(mǎi)了二手內存時,出(chū)現這個(gè)問題,這時,你就要檢查是不是內存出問題了或者和其它(tā)硬件不兼容(róng)。
4、微軟WINDOWS係統的漏洞(dòng)
windows把內存地址0X00000000到0X0000ffff指定為(wéi)分配null指針的地址範圍,如果程序試圖訪問這一地址,則認為是錯誤。c/c++編寫的程序通(tōng)常不進行嚴格的錯誤檢查,當采(cǎi)用(yòng)malloc來分配內(nèi)存而可供分(fèn)配的地址空間不夠的情況下返回null指針。但是(shì)代碼不檢查這種錯誤,認為地址分配(pèi)已經成功,於是就訪問0X00000000的(de)地址,於(yú)是就發(fā)生內(nèi)存違規訪問,同時該進(jìn)程被終止。
5、可能沒有完全(quán)正確安裝apache服務(wù),且啟動了它(tā)的原(yuán)故(gù); 把服務中的 OracleOraHomeXXHTTPServer改成停止(zhǐ)
6、應(yīng)用程(chéng)序沒有檢(jiǎn)查內(nèi)存(cún)分配失敗
程(chéng)序需要(yào)一塊內存用以保存(cún)數據時,就需要(yào)調用操作係統提供的“功能函數(shù)”來申請,如果內存分配成功(gōng),函數就會(huì)將所新開辟(pì)的內存區地址(zhǐ)返回給應(yīng)用程序,應(yīng)用程序(xù)就可(kě)以通過這個地址使用這塊內存。這就(jiù)是“動(dòng)態內存分配”,內存地址也就是編程中的“指針”。
內存(cún)不是(shì)永遠都招之即(jí)來、用之不(bú)盡的,有時候內存分配也會失(shī)敗。當分配失敗時(shí)係統函數會返回(huí)一(yī)個0值,這時返回值“0”已不表示新啟(qǐ)用(yòng)的指針,而是係統(tǒng)向應用程序發出(chū)的一個通知,告(gào)知出現了(le)錯誤。作(zuò)為應用程序,在每一次申(shēn)請內存後都應該檢查返回值是否為0,如果是,則意(yì)味著出(chū)現(xiàn)了故障(zhàng),應該采取(qǔ)一些措施挽救,這就增強了程序的“健壯性”。
若應(yīng)用程(chéng)序沒有檢查這個錯誤,它就會按照“思(sī)維慣性”認為這個值(zhí)是給(gěi)它分配的可用(yòng)指針,繼續(xù)在之後的運(yùn)行中(zhōng)使用這塊內存。真正的0地址內存區保(bǎo)存(cún)的是(shì)計算機係統中(zhōng)最重要(yào)的“中斷描述符表(biǎo)”,絕(jué)對不允(yǔn)許應(yīng)用程序使用(yòng)。在沒有保護機製(zhì)的操(cāo)作(zuò)係統下(如DOS),寫數(shù)據到這個地址會導致立即死機,而在健壯的(de)操作係統(tǒng)中,如Windows等(děng),這個操作會馬(mǎ)上被係統的(de)保護機製捕獲,其結(jié)果就(jiù)是(shì)由操作係統強(qiáng)行關閉(bì)出錯的應用(yòng)程序,以防(fáng)止其錯(cuò)誤擴大(dà)。這(zhè)時候,就會出現上述的“寫內(nèi)存”錯誤,並指出被引用的內(nèi)存地址為“0x00000000”。
內存(cún)分配失敗故障(zhàng)的原因很多,內存不夠、係統函數的版(bǎn)本不匹配等都可能有影響。因此(cǐ),這種分配失敗(bài)多見(jiàn)於(yú)操(cāo)作(zuò)係統使用很長時(shí)間後,安(ān)裝了(le)多種(zhǒng)應用程(chéng)序(xù)(包(bāo)括無意中“安裝”的病毒程序),更改了大量的係統參數和係統文件(jiàn)之後。
7、應用程序由於(yú)自身BUG引用(yòng)了不正常的內存指(zhǐ)針
在使用(yòng)動態分(fèn)配的應用程(chéng)序中,有時會有這樣的情況出現:程序試圖讀(dú)寫一塊“應該可用”的內存,但不知為什麽,這個預料中可用的(de)指針已經失效了。有(yǒu)可能是“忘記了”向操作係統要求分配,也可能是(shì)程序(xù)自(zì)己在某(mǒu)個時候已(yǐ)經(jīng)注銷了這塊內(nèi)存而“沒有留意”等等。注銷了的內存被係統回收,其訪問權已經不屬(shǔ)於該應用程序(xù),因(yīn)此讀寫操作也同樣會觸發係統的保護(hù)機製,企(qǐ)圖(tú)“違法”的程序唯(wéi)一的下場(chǎng)就是被操作終止運行,回收全部資(zī)源。計(jì)算機世界的(de)法律還是要比人類有效和嚴厲得多啊(ā)!
像這(zhè)樣的(de)情況都屬於程序自身的BUG,你往(wǎng)往可在特定的操作順序下重(chóng)現錯誤。無效指針不一定總是(shì)0,因此錯誤提示(shì)中的內存地址也不一定為“0x00000000”,而是(shì)其(qí)他(tā)隨機(jī)數字。
關鍵詞:內存,read
閱讀本文後(hòu)您有什(shí)麽感想? 已有 人(rén)給出(chū)評價!
- 1
- 119
- 1
- 1
- 2
- 1