運行程序提示access violation at address的解決方法解決您的問題( 二 )


(5) 檢查一下計算機里是否有沒用的東西和程序沖突 。 奇怪的軟件程序和測試版的產品常常會導致Access Violation錯誤 。
【運行程序提示access violation at address的解決方法解決您的問題】(6) 如果系統設置有錯誤 , 那么Access Violation錯誤可能也會經常出現 。 如果你不停地遇到一個錯誤提示信息一樣的Access Violation , 記錄下這些細節 , 然后通知可能導致這個錯誤的軟件制造廠商 。
這些就是我對設計期Access Violation錯誤的全部建議 。
二、運行期的Access Violation
Delphi常見的運行期Access Violation錯誤有哪些?如何防止?
任何軟件開發都會遇到這樣的情況:你寫好程序并測試 , 然后到處發送 , 結果用戶告訴你它失敗了 。
你可能考慮用編譯指令{$D}編譯你的程序——Delphi可以建立一個有助于定位Access Violation錯誤的源代碼的鏡像文件 。 工程選項對話框(ProjectOptionsLinker Compiler)讓你指定你所需要的一切 。 對于單元文件 , debug信息和單元的對象代碼一起記錄在unit文件里了 。 編譯使用這個單元的程序時 , debug信息會增加單元文件的大小而且會增加額外的內存開銷 , 但是它不會影響最終可執行文件的大小和運行速度 。 包含debug信息和鏡像文件(ProjectOptionsLinker)選項的產品只有在{$D+} 編譯指令下才會完成行信息 。
Access violation通常只在程序的某一個方面表現出來 。 當問題第一次出現時 , 考慮一下用戶進行了什么操作是很重要的 , 然后從這里尋找突破口 。 從用戶的角度來看 , 你的程序中止了他們的工作 , 由他們來告訴你出現的問題似乎讓你延期解決這個問題了 。 然而 , 與用戶交流是你發現問題和改善程序的惟一有效方法 。
現在你將可以知道在只給你沖突地址的情況下 , 如何輕松發現準確路徑、源代碼文件、發生Access violation錯誤的行:
“Search - Find Error…” 。
當一個運行期Access violation出現時 , 你的用戶得到的錯誤信息類似于如下情況:
Access violation at address <十六進制值>
in module <應用程序名>
Read of address <十六進制值>
如果你的程序在Delphi IDE里包含debug信息編譯 , 你可以定位到導致這個錯誤源代碼這一行 。
在Delphi程序中 , 一個最普遍導致Access Violation錯誤的原因是使用了一個沒有被創建的對象 。 如果第二個地址<十六進制值>是FFFFFFF或0000000 , 十有八九就是你訪問? 了一個沒有被建立的對象 。 例如 , 你調用了一個表單的事件 , 但這個表單不是自動創建的 , 也沒有代碼實例化 。
?procedure TfrMain.OnCreate(Sender: TObject);
var BadForm: TBadForm;
begin
//這里將會產生Access violation
BadForm.Refresh;
end;
假設BadForm在工程選項“Available Forms”窗口列表里——這個窗口是需要手工創建和釋放的 。 在上面的代碼里調用BadForm窗口的Refresh方法就會導致Access violation 。
如果你在Debugger選項窗口使“Stop on Delphi Exceptions”生效 , 那么就會彈出下面的信息:
The message states that the EAccessViolation has occurred. The EAccessViolation is the exception class for invalid memory access errors.
這是你在設計程序時將會看到的信息 , 下一個信息框將會出現 , 然后程序失敗了:
Access violation at address 0043F193
in module ’Project1.exe’
Read of address 000000.
第一個十六進制數0043F193是發生Access violation的編譯代碼(Project1.exe)的運行期錯誤的地址 。 在IDE里選擇菜單項“SearchFind Error…” , 在對話框里輸入錯誤發生的地址(0043F193)后點擊“OK”按鈕 。 Delphi將會重新編譯你的工程文件 , 然后顯示發生運行期錯誤的那一行代碼 , 這里就是BadForm.Refresh這一行了 。
下面列出了Delphi環境下導致Access violation錯誤的大部分常見原因 。 這個列表不是也不可能覆蓋所有可能出現的Access violation的情況 。 請在論壇上發送你的Access violation信息 , 大家可以試著一起解決這個問題——真正的實際事例一般情況下比列出來的錯誤隱晦得多 。
1. 調用一個不存在的對象
如上所述 , 大部分Access violation的合理原因是使用了沒有被創建或者已經被釋放的對象 。 為了防止這種類型的Access violation的發生 , 請確保你訪問的任何對象都首先被創建了 。 例如 , 當一個Table定位在一個沒有被創建的data module(從auto-crete窗口里移走了)里 , 你可能在窗體的OnCreate事件里打開這個表 。

推薦閱讀