Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi访问冲突分配局部变量_Delphi_Variables_Access Violation - Fatal编程技术网

Delphi访问冲突分配局部变量

Delphi访问冲突分配局部变量,delphi,variables,access-violation,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 //(

这似乎是世界上最简单的事情了,我已经准备好了

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

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
unitmyunit;
// ...
//正常声明
//...
公开的
//一系列程序,包括
程序我的程序;
常数
//一串常数
变量
//一堆VAR,包括
myCounter:整数;
实施
使用//(我所有的使用)
//我所有的程序包括
程序我的程序;
尝试
//将项目从文件加载到TListBox-这一切都有效
除了
在eReader上,请不要开始
//处理异常
结束;
结束//尝试

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

我不认为您的错误与它看起来的意思类似。当你从这样一段代码中得到一个访问冲突,而这段代码没有产生访问冲突的合理方法时,你正在以某种方式查看被破坏的内存


在“CPU”窗口中逐级检查有问题的代码,看看到底发生了什么。

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


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

赋值myCounter:=0引发访问冲突表明存储全局变量的数据段已从内存中删除,或者在我的程序例行程序中对寄存器进行冲洗


使用CPU视图查看用于访问全局var的寄存器,然后从那里向后查看这些寄存器出错的位置。

读取地址00000008
意味着您正在从nil指针读取偏移量为8字节的变量。这根本不符合你在这里要做的,因为你在写,而不是在读,你在写一个常量,而不是从某处读取的变量

您确定这是触发异常的实际行吗?你在这一行设置断点了吗?你试过把这条线移到程序的顶端吗


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

这不会导致访问简单变量的访问冲突。不,没有数组,移动var也没有什么帮助。这是一个相当大且非常稳定的应用程序,在我加入这个小片段之前,它工作得很好。@Loren-谢谢,是的,你是对的。上周我帮助一位同事解决了似乎完全相同的问题,但现在我想起来了,数组正在覆盖指针,而不是简单的变量。有趣的是,这很酷,因为数组是在指针下面声明的,但当数组声明为[1..5]时,他使用元素[0]来“下溢”。哎呀!您能否给出访问冲突错误消息的确切文本,包括地址?这可能很重要。-------------------------------------调试器异常通知-----------------Project.exe引发了异常类EAccessViolation,消息为“模块.exe中地址0043FDE8处的访问冲突”。读取地址0000000 8'。------------------------------------中断继续帮助-----------------公平点。细齿梳子总是最后的选择,我希望我做了一些明显错误的事情,这可能是显而易见的。我会试一试,如果没有别的,我想我只会建造一个新的单位,而不是增加到一个旧的。不能说我渴望花费比我已经浪费的更多的时间来跟踪CPU寄存器来解决helloWorld问题。另一个选项:在最初计算变量的位置设置断点。验证存储的数字是否正确,然后在指针上设置内存修改断点。(注意,我在操作系统本身就有这些问题。它可能非常难看。)说得好。在指令点转移到下一条指令/语句后,通常会发生硬件异常。看看后视镜,看看你撞到了什么东西。>我刚在做了一次CPU跟踪之后发现了这个问题,但是你说得对——我正在清除(使用xx.Clear方法)一个导致问题的TIdEmailAddressList(Indy组件)。处理事情并稍后访问它也会抛出异常**编辑-实际上,正在清除的是TListBox。同样,问题解决了。谢谢大家的好主意。过早脱发还得再等一天。干杯。太搞笑了——有些人很快就把责任推到“with”上,甚至指责它在根本不涉及它的代码中造成了问题。虽然我们应该小心。。。在这种情况下,可能是GOTO声明造成的@Deltics-由于OP并没有显示所有内容,虽然有些牵强,但这是一个很好的猜测。@Lieven:根本不是真的。这个猜测不如100%准确的猜测好(假设这个猜测的准确率为0%):)@Deltics-好吧,你说了算。:)