使用Windows操作系統的人有時會遇到這樣的錯誤信息
「“X????????”指令引用的“x”內存該內存不能為“read”或“written”」然後應用程序被關閉
如果去請教一些「高手」得到的回答往往是「Windows就是這樣不穩定」之類的義憤和不屑其實這個錯誤並不一定是Windows不穩定造成的本文就來簡單分析這種錯誤的一般原因
一應用程序沒有檢查內存分配失敗
程序需要一塊內存用以儲存數據時就需要使用操作系統提供的「功能函數」來申請如果內存分配成功函數就會將所新開辟的內存區地址返回給應用程序應用程序就可以通過這個地址使用這塊內存這就是「動態內存分配」內存地址也就是編程中的「光標」內存不是永遠都招之即來用之不盡的有時候內存分配也會失敗當分配失敗時系統函數會返回一個值這時返回值「」已不表示新啟用的游標而是系統向應用程序發出的一個通知告知出現了錯誤作為應用程序在每一次申請內存後都應該檢查返回值是否為如果是則意味著出現了故障應該采取一些措施挽救這就增強了程序的「健壯性」若應用程序沒有檢查這個錯誤它就會按照「思維慣性」認為這個值是給它分配的可用游標繼續在之後的執行中使用這塊內存
真正的地址內存區儲存的是計算機系統中最重要的「中斷描述符表」絕對不允許應用程序使用在沒有保護機制的操作系統下(如DOS)寫數據到這個地址會導致立即當機而在健壯的操作系統中如Windows等這個操作會馬上被系統的保護機制捕獲其結果就是由操作系統強行關閉出錯的應用程序以防止其錯誤擴大這時候就會出現上述的「寫內存」錯誤並指出被引用的內存地址為「x」內存分配失敗故障的原因很多內存不夠系統函數的版本不匹配等都可能有影響因此這種分配失敗多見於操作系統使用很長時間後安裝了多種應用程序(包括無意中「安裝」的病毒程序)更改了大量的系統參數和系統檔案之後
二應用程序由於自身BUG引用了不正常的內存光標
在使用動態分配的應用程序中有時會有這樣的情況出現程序試圖讀寫一塊「應該可用」的內存但不知為什麼這個預料中可用的光標已經失效了有可能是「忘記了」向操作系統要求分配也可能是程序自己在某個時候已經注銷了這塊內存而「沒有留意」等等注銷了的內存被系統回收其訪問權已經不屬於該應用程序因此讀寫操作也同樣會觸發系統的保護機制企圖「違法」的程序唯一的下場就是被操作終止執行回收全部資源計算機世界的法律還是要比人類有效和嚴厲得多啊!像這樣的情況都屬於程序自身的BUG你往往可在特定的操作順序下重現錯誤無效光標不一定總是因此錯誤提示中的內存地址也不一定為「x」而是其它隨機數字如果系統經常有所提到的錯誤提示下面的建議可能會有說明
檢視系統中是否有木馬或病毒這類程序為了控制系統往往不負責任地修改系統從而導致操作系統異常平常應加強信息安全意識對來源不明的可執行程序絕不好奇
更新操作系統讓操作系統的安裝程序重新拷貝正確版本的系統檔案修正系統參數
有時候操作系統本身也會有BUG要注意安裝官方發行的升級程序
試用新版本的應用程序
Mode:
將虛擬內存撤換
答案:
目前為止是肯定的也就是如在下次冷天到來時亦沒再發生就代表這是主因
追加:
如果你用 Ghost 恢復 OS 後建議 刪除WINDOWSPREFETCH目錄下所有*PF文件因為需讓windows重新收集程序的物理地址
有些應用程序錯誤 "xcd" 指令參考的 "xc" 內存該內存不能為 "read"推論是此原因
源由:
Win XP的「預讀取」技術
這種最佳化技術也被用到了應用軟件上系統對每一個應用軟件的前幾次啟動情況進行分析然後新增一個描述套用需求的虛擬「內存映像」並把這些信息儲存到WINDOWSPREFETCH數據夾一旦建立了映像應用軟件的裝入速度大大提高XP的預讀取數據儲存了最近次系統啟動或應用軟件啟動的信息
後敘:
目前此方法亦是獨步網絡的(其碼自己針對此問題查了許久)也是常見問題原本幾乎每天睡前關閉軟件時一些程序都會發生read
現在就沒發生了
運行某些程序的時候有時會出現內存錯誤的提示(x後面內容有可能不一樣)然後該程序就關閉
“x????????”指令引用的“x????????”內存該內存不能為“read”
“x????????”指令引用的“x????????”內存該內存不能為“written”
不知你出現過類似這樣的故障嗎?
一般出現這個現象有方面的一是硬件即內存方面有問題二是軟件這就有多方面的問題了
下面先說說硬件
一般來說內存出現問題的可能性並不大主要方面是內存條壞了內存質量有問題還有就是個不同牌子不同容量的內存混插也比較容易出現不兼容的情況同時還要注意散熱問題特別是超頻後你可以使用MemTest 這個軟件來檢測一下內存它可以徹底的檢測出內存的穩定度
假如你是雙內存而且是不同品牌的內存條混插或者買了二手內存時出現這個問題這時你就要檢查是不是內存出問題了或者和其它硬件不兼容
如果都沒有那就從軟件方面排除故障了
先簡單說說原理內存有個存放數據的地方叫緩沖區當程序把數據放在其一位置時因為沒有足夠空間就會發生溢出現象舉個例子一個桶子只能將一斤的水當你放入兩斤的水進入時就會溢出來而系統則是在屏幕上表現出來這個問題經常出現在windows和XP系統上Windows /XP對硬件的要求是很苛刻的一旦遇到資源死鎖溢出或者類似Windows 裡的非法操作系統為保持穩定就會出現上述情況另外也可能是硬件設備之間的兼容性不好造成的
下面我從幾個例子給大家分析
例一打開IE浏覽器或者沒過幾分鐘就會出現"xdcff"指令引用的"x"內存該內存不能為“read”要終止程序請單擊“確定”的信息框單擊“確定”後又出現“發生內部錯誤您正在使用的其中一個窗口即將關閉”的信息框關閉該提示信息後IE浏覽器也被關閉 解決方法修復或升級IE浏覽器同時打上補丁看過其中一個修復方法是Win自升級也就是Win升級到Win其實這種方法也就是把系統還原到系統初始的狀態下比如你的IE升級到了自升級後會被IE代替
例二在windows xp下雙擊光盤裡面的“AutoRunexe”文件顯示“xfcc”指令引用的“x”內存該內存不能為“written”要終止程序請單擊“確定”而在Windows 裡運行卻正常 解決方法這可能是系統的兼容性問題winXP的系統右鍵“AutoRunexe”文件屬性兼容性把“用兼容模式運行這個程序”項選擇上並選擇“Windows /Me”win如果打了SP的補丁後只要開始運行輸入regsvr c:winntapppatchslayeruidll右鍵屬性也會出現兼容性的選項
例三RealOne Gold關閉時出現錯誤以前一直使用正常最近卻在每次關閉時出現“xffffffff”指令引用的“xffffffff”內存該內存不能為“read” 的提示 解決方法當使用的輸入法為微軟拼音輸入法並且隱藏語言欄時(不隱藏時沒問題)關閉RealOne就會出現這個問題因此在關閉RealOne之前可以顯示語言欄或者將任意其他輸入法作為當前輸入法來解決這個問題
例四我的豪傑超級解霸自從上網後就不能播放了每次都提示“xf”(每次變化)指令引用的“xff”內存不能為“read”終止程序請按確定 解決方法試試重裝豪傑超級解霸如果重裝後還會到官方網站下載相應版本的補丁試試還不行只好換就用別的播放器試試了
例五雙擊一個游戲的快捷方式“xfcd”指令引用“xffffffff”內 存該內存不能為“read” 並且提示Clientdat程序錯誤 解決方法重裝顯卡的最新驅動程序然後下載並且安裝DirectX
例六一個朋友發信息過來我的電腦便出現了錯誤信息:“xbf”指令引用的“x”內存該內存不能為“written”然後QQ自動下線而再打開QQ發現了他發過來的十幾條的信息 解決方法這是對方利用QQ的BUG發送特殊的代碼做QQ出錯只要打上補丁或升級到最新版本就沒事了
【原因 解決方法】
內存條壞了 更換內存條
雙內存不兼容 使用同品牌的內存或只要一條內存
內存質量問題 更換內存條
散熱問題 加強機箱內部的散熱
內存和主板沒插好或其他硬件不兼容 重插內存或換個插槽
硬件有問題 更換硬盤
驅動問題 重裝驅動如果是新系統應先安裝主板驅動
軟件損壞 重裝軟件
軟件有BUG 打補丁或更新到最新版本
軟件和系統不兼容 給軟件打上補丁或是試試系統的兼容模式
軟件和軟件之間有沖突 如果最近安裝了什麼新軟件卸載了試試
軟件要使用其他相關的軟件有問題 重裝相關軟件比如播放某一格式的文件時出錯可能是這個文件的解碼器有問題
病毒問題 殺毒
殺毒軟件與系統或軟件相沖突 由於殺毒軟件是進入底層監控系統的可能與一些軟件相沖突卸載試試
系統本身有問題 有時候操作系統本身也會有BUG要注意安裝官方發行的更新程序象SP的補丁最好打上如果還不行重裝系統或更換其他版本的系統
〔又一說〕
在控制面板的添加/刪除程序中看看你是否安裝了微軟NETFramework如果已經安裝了可以考慮卸載它當然如果你以後在其它程序需要NETFramework時候可以再重新安裝
另外如果你用的是ATI顯卡並且你用的是SP的補丁(一些ATI的顯卡驅動需要在NETFramework正常工作的環境下)這種情況你可以找一款不需要NETFramework支持的ATI顯卡驅動
如果以上兩種方法並不能完全解決問題你試著用一下“IE修復”軟件並可以查查是否有病毒之類的
〔微軟NETFramework升級到版應該沒問題了〕
〔還有一說〕
方法一
微軟新聞組的朋友指點:開始運行regsvr jscriptdll
開始運行regsvr vbscriptdll
不過沒解決但提供了路子一次運行注冊所有dll
搜索查找到方法如下:
運行 輸入cmd 回車在命令提示符下輸入for % in (%windir%system*dll) do regsvrexe /s %這個命令老兄你慢慢輸 輸入正確的話會看到飛快地滾屏 否則……否則失敗就是沒這效果回車後慢慢等(需要點時間分鐘) 都運行完再打開看
方法二
這是個典型問題~~~~~引起這個問題的原因很多一般來講就是給系統打上補丁和更換內存給內存換個插槽這種方法來解決[系統補丁只要到Microsoft Update網站在線更新就可以了]
(偶見)
造成這種問題的原因很多不能單純的下結論盡量做到以下幾點可能對你有幫助
確保使用的是未修改過的軟件(非漢化破解版)
使用改軟件時盡量不要運行其他軟件(這是個臨時文件可能某些軟件也在使用臨時文件夾所以產生干擾)
把那些什麼桌面工具內存整理工具通通關掉(你至少有個類似的工具在運行)”
處理方法
運行regedit進入注冊表 在HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionExplorerShellExecuteHooks下應該只有一個正常的鍵值"{AEBEEdEECFD} 將其他的刪除
〔我個人的最後解決和看法〕
我今天嘗試了多種辦法最後我發現問題出在微軟的NETFramework上面我升級了這個軟件並打齊了補丁短暫平安後有出現“內存不能為read”的情況後來我受上面文章的啟發卸載了微軟的NETFramework和世界太平了
另外如果是打開“我的電腦”“我的文檔”等的時候出現上述情況還有一種可能就是你的右鍵菜單太臃腫了此時只要清理右鍵菜單問題就解決了
〔試驗的結果〕
上面的方法最管用最徹底的方法是這個
運行 輸入cmd 回車在命令提示符下輸入
for % in (%windir%system*dll) do regsvrexe /s %
【技巧】如果怕輸入錯誤的話可以復制這條指令然後在命令提示框點擊左上角的c使用下面的“編輯粘貼”功能就不容易輸錯了在飛速滾屏完全靜止之後別著急啟動其他程序先耐心等一會兒因為此時dll們還在找位置直到你的指示燈不閃了再做別的
From:http://tw.wingwit.com/Article/Common/201311/8256.html