Delphi中string操作的访问冲突

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

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; 

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

MyProgram.exe错误消息:0x00406111访问冲突:写入地址0x00090d1c(这有所不同)。 程序停止了。 使用步骤或运行继续。

对我来说,这味道像某种堆溢出。 我试过replace

 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 

但它没有帮助。 有关我应该如何解决这个问题的任何build议?

PS试图在Win7 32位和Win7 64位上运行它 – 没有什么区别PPS抱歉的长问题。

唯一的解释

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

导致访问冲突是你已经损坏了堆。

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

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

一些调试工具可能有助于:

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