访问Delphi中字符串操作的违规行为

时间:2013-09-20 11:14:01

标签: windows delphi delphi-7 access-violation

我有一个Delphi应用程序,它从文件中读取数据并将其存储在数组中。文件中的每一行都包含一个地址,lineTypeIndicator和数据。这是算法(包含我认为至关重要的代码):

AssignFile(inputFile, inFileName);
Reset(inputFile);
  while not EOF(inputFile) do
  begin
    Readln(inputFile,fileLineBuffer);        
     if  Copy(fileLineBuffer, 8, 2) = '01' then  //Never managed to catch the error here
    begin
      break;
    end;

    //extract the address from the line and use it to determine max and min address.
  end;

//Now that you have min and max address, use it to set the length of an char array
SetLength(memoryArray,(lastAddress - firstAddress) * 2);

Reset(inputFile);
  while not EOF(inputFile) do
  begin
    Readln(inputFile,fileLineBuffer);

     if  Copy(fileLineBuffer, 8, 2) = '01' then    //I caught all the errors here
    begin
      break;
    end;

    //extract the address and data from the fileLineBuffer and place it in the corresponding place in an array
  end;

每次用户单击表单上的相应按钮时,都会执行此代码。它运行的前几次运行,但经过几次运行后我得到了这个:

  

MyProgram.exe出现错误信息:'访问冲突位于0x00406111:   写入地址0x00090d1c(这会有所不同)。进程停止了。使用步骤   或跑去继续。

对我来说,这闻起来像某种堆溢出。我试过替换

if  Copy(fileLineBuffer, 8, 2) = '01' then              

lineTypeBuffer :=   Copy(fileLineBuffer, 8, 2);
if  lineTypeBuffer = '01' then                   

if  (fileLineBuffer[8] = '0') and (fileLineBuffer[9] = '1') then 

但它没有帮助。 关于如何处理这个问题的任何建议?

P.S。尝试在Win7 32位和Win7 64位上运行它 - 没有区别 P.P.S.抱歉这个问题很长。

1 个答案:

答案 0 :(得分:2)

的唯一解释
Copy(fileLineBuffer, 8, 2) = '01'

导致访问冲突是您已损坏堆。

程序中的其他东西是写出界限并破坏堆。这些问题可能很难诊断,因为故障通常在代码的一部分,但错误发生在其他地方。有些代码会破坏堆,然后由于早期的堆损坏而导致后续堆操作失败。

我对我的诊断充满信心,因为已知Delphi字符串变量有效,Copy已知有效,并且已知字符串相等性测试有效。换句话说,在发生错误的代码行中没有错误。因此错误在其他地方。

一些可能有用的调试工具:

  • 完全调试模式下的FastMM。
  • 范围检查(从项目的编译器选项启用)。