这似乎是世界上最简单的东西,我已经准备好把头发拉过来了。
我有一个看起来像这样的单位;
Unit myUnit;
// ...
//normal declarations
//...
Public
//bunch of procedures including
Procedure myProcedure;
const
//bunch of constants
var
//bunch of vars including
myCounter:integer;
Implementation
Uses //(all my uses)
// All of my procedures including
Procedure myProcedure;
try
// load items from file to TListBox - this all works
except
on EReadError do begin
// handle exception
end;
end; //try
myCounter:=0; // <-- ACCESS VIOLATION HERE
while myCounter //...etc
这是一个简单的变量赋值,我不知道为什么会这样做。我已经尝试将该变量本地的变量声明到整个过程 - 无论我在哪里尝试这样做我都不能将值0赋给一个整数,在此过程中声明的任何地方,而不会抛出访问权限违反。我完全被难过了。
我从同一单元内的按钮OnClick处理程序中调用该过程,但无论我从哪里调用它都会引发异常。疯狂的是,我在整个程序中的十几个其他地方做同样的事情没有问题。为什么在这?我完全失去了。
答案 0 :(得分:10)
Read of address 00000008
表示您正在从 nil 指针的8字节偏移处读取变量。这根本不适合你在这里尝试做的事情,因为你正在写作,而不是阅读,而你正在写一个常量,而不是从某个地方读取变量。
你确定这是触发异常的实际行吗?你在这条线上放了一个断点吗?您是否尝试将此行移至程序的顶部?
很难确定没有你的实际代码在我面前,但是如果我不得不猜测,我会说之前的行这导致异常,然后是指令指针已经增加,所以德尔福突出了下一行。
答案 1 :(得分:2)
我不认为你的错误意味着它看起来像什么。当您从这样的代码中获得访问冲突时,没有明智的方式产生访问冲突,您会以某种方式查看已丢失的内存。
逐步查看CPU窗口中的违规代码,看看究竟发生了什么。
答案 2 :(得分:1)
您正在使用语句并正在查看另一个myCounter?
你的代码的某些部分是在内存中写入它不应该或在它不应该释放时,并且在访问特定的局部变量时偶然会导致AV?
答案 3 :(得分:1)
赋值myCounter:= 0抛出访问冲突表明存储了全局变量的数据段已从内存中删除,或者寄存器在myProcedure例程中被清除。
使用CPU视图查看用于访问全局变量的寄存器,然后从那里向后工作以查看那些/那些寄存器出错的位置。
答案 4 :(得分:0)
将MyCounter移动到var列表的顶部,看看它是否仍然存在。如果问题消失了,请查看上面声明的vars - 你可能会发现一些有趣的东西,例如一个越过边界的数组。