Comeasy來購網

2007-03-31

解開「0x000000該記憶體不能為read或written」的錯誤訊息!

Windows對記憶體的使用是採動態分配,當程式需要在記憶體裡儲存資料時,必須先透過Windows函式來申請需要使用的記憶體位址,就像辦活動必須先租借場地一樣,假如場地不加以管制,就會大家搶著用,而真正要用的人反而找不到場地。當申請成功時,系統便會告訴應用程式:「你可以使用0x某某某區段的記憶體位址」。

但是有時程式想要租借的場地(某段記憶體位址)因某些因素無法出租(即記憶體分配失敗),此時場地管理員(Windows函式)會回覆說「不能申請」,並回傳一個「0」數值給應用程式。理論上來說,當程式接收到「0」值得回應後,就該知道申請失敗,並重新提出申請、或做其他補救措施。 不過有些設計不夠周全的程式,或受到記憶體故障的干擾結果,在提出申請後就不再核對系統的答覆;若系統傳回「申請失敗」的「0」數值,但是應用程式少了一道核對機制,會誤以為「0」代表著系統分配「0x000000」這段位址是系統儲存中斷向量表用的,不允許寫入其他資料,Windows系統為了避免錯誤情形繼續擴大,只好把提出申請的應用程式強制關閉。

□ 記憶體品質好壞,透過『Windows Memory Diagnostic』
當你的電腦無法安裝作業系統,或作業時常出現藍底白字0x000000錯誤訊息,有可能是記憶體穩定性出現問題。這裡我們推薦微軟官方『Windows Memory Diagnostic』測試軟體,它可用來測試記憶體與Windows相容性,所測得記憶體數據值得參考。
解決方法:
微軟官網:http://oca.microsoft.com/en/windiag.asp
下載位址:http://oca.microsoft.com/en/mtinst.exe

□ 重新註冊所有DLL檔(動態連結函式庫)
DLL檔是電腦中非常重要的檔案,由於視窗作業系統中的應用程式眾多且龐大,如果把所有程式碼包成一個EXE執行檔,不僅檔案會變的非常大,執行時也會很耗費記憶體。因此把常用、有重複性的程式碼獨立出來,包成一個個DLL檔,當主程式需要時再另外載入,如此可以讓不同程式可以互相共用相同的函式庫,節省軟體開發時間,並大幅節省記憶體的濫用。不過若碰到DLL檔登記時出了問題,可能就會讓系統發生記憶體位址分配錯誤的情形,此時可重新註冊電腦中所有DLL檔,幫它們讓XP作業系統便於掌控。
解決方法:
於「命令提示字元」視窗,輸入已下指令後按下【Enter】:
For %1(%windir%\system32\*.dll) do regsvr32.exe /s %1

□ 刪除預讀檔,記憶體錯誤不再發生
為了讓系統運作速度更快,XP設計了一套「預讀」(Prefetch)技術。在前幾次啟動應用程式時,會將啟動情形經分析後,製作一份最佳化的映象檔到「C:\Windows\Prefetch\」資料夾中,讓下次啟動同一應用程式時,就會從裡面先讀取必要資料,以提升軟體的載入速度。不過有時候會因為軟體的Bug或是在預讀時發生錯誤,導致在載入預讀檔時,向系統要求了不正確的記憶體位址,而被XP內建的保護系統檔下,因此也會出現記憶體位址錯誤的警告訊息。
解決方法:
開啟檔案總管進入「C:\Windows\Prefetch\」資料夾中,將裡頭所有檔案刪除即可。

□ 使用正式版軟體,測試版問題多
通常在軟體正式發行前或遊戲正式上市前,都會釋出Alpha版(通常是Bug最多的版本,有的功能尚未完備)或伺服器免費封測帳號、Beta版(接近正式釋出的版本,但還有未知的Bug)及RC版(準備上市前的最後版本)。不過即使軟體正式上市後,都還可能有突然發現的Bug,何況是還是開發中的版本呢?所以如果你在使用某過特定軟體時,一直出現記憶體錯誤,不妨看看該軟體是否有「Beta」等字樣,如果有的話,請換成正式版本的軟體使用,也許就能解決擾人的問題。

□ 安裝更新檔,解決記憶體錯誤
有的軟體在正式發行後,才發現有重大缺失,可能會與某些軟體硬體衝突,因此常回去軟體官方網站,看看是否有更新版本的升級檔可以補強,有時候也能解決軟體造成的記憶體錯誤問題。

□ 經常掃毒,防止病毒藏身記憶體
有的電腦病毒會將自己常駐在記憶體中,佔住可以使用的記憶體資源,並強取電腦的主控權,因此造成電腦的使用異常,導致板來可以使用的記憶體卻無法使用,就容易出現記憶體位址錯誤訊息了。
解決方法:
安裝防毒軟體或是掃除木馬的軟體,並經常更新病毒碼,定期掃毒確保電腦中沒有病毒或木馬存在,不要讓病毒干擾電腦的運作。