10

这似乎是世界上最简单的事情,我准备把头发拉出来。

我有一个看起来像这样的单元;

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

这是一个简单的变量赋值,我不知道它为什么这样做。我已经尝试将变量声明为单元的局部变量、过程的全局变量——无论我在哪里尝试这样做,我都无法将零值赋给在此过程中任何地方声明的整数,而不会引发访问违反。我完全被难住了。

我从同一单元内的按钮 OnClick 处理程序内部调用该过程,但无论我从哪里调用它都会引发异常。疯狂的是,我在整个程序的其他十几个地方做同样的事情,没有任何问题。为什么在这里?我完全不知所措。

4

5 回答 5

10

Read of address 00000008意味着您正在从nil指针读取偏移 8 个字节的变量。这根本不适合您在这里尝试做的事情,因为您正在编写,而不是阅读,并且您正在编写一个常量,而不是从某个地方读取的变量。

您确定这是触发异常的实际行吗?你有没有在这条线上设置断点?您是否尝试过将此行移到程序的顶部?

如果没有您面前的实际代码,很难确定,但如果我不得不猜测,我会说在此之前的行导致异常,然后指令指针已经增加,因此 Delphi 突出显示下一行。

于 2010-04-27T17:36:44.387 回答
2

我不认为你的错误意味着它看起来像什么。当您从这样的一段代码中获得访问冲突时,它没有产生访问冲突的正常方法,您正在以某种方式查看被破坏的内存。

逐步检查 CPU 窗口中的违规代码,看看到底发生了什么。

于 2010-04-27T17:09:18.627 回答
1

您正在使用 with 语句并且正在查看不同的 myCounter?

您的代码的某些部分正在写入它不应该或不应该释放的内存中,并且在访问该特定局部变量时意外导致 AV?

于 2010-04-27T17:10:49.050 回答
1

赋值 myCounter := 0 抛出访问冲突表明存储全局变量的数据段已从内存中删除,或者寄存器在您的 myProcedure 例程中被冲洗。

使用 CPU 视图查看用于访问全局变量的寄存器,然后从那里向后工作以查看那些/那些寄存器出错的地方。

于 2010-04-27T17:11:34.287 回答
0

将 MyCounter 移到 var 列表的顶部,看看它是否仍然发生。如果问题消失了,请查看上面声明的变量 - 您可能会发现一些有趣的东西,例如超出其边界的数组。

于 2010-04-27T17:08:07.203 回答