Delphi访问冲突分配局部变量

时间:2010-04-27 17:03:02

标签: delphi variables access-violation

这似乎是世界上最简单的东西,我已经准备好把头发拉过来了。

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

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处理程序中调用该过程,但无论我从哪里调用它都会引发异常。疯狂的是,我在整个程序中的十几个其他地方做同样的事情没有问题。为什么在这?我完全失去了。

5 个答案:

答案 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 - 你可能会发现一些有趣的东西,例如一个越过边界的数组。