我有一个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.抱歉这个问题很长。
答案 0 :(得分:2)
的唯一解释
Copy(fileLineBuffer, 8, 2) = '01'
导致访问冲突是您已损坏堆。
程序中的其他东西是写出界限并破坏堆。这些问题可能很难诊断,因为故障通常在代码的一部分,但错误发生在其他地方。有些代码会破坏堆,然后由于早期的堆损坏而导致后续堆操作失败。
我对我的诊断充满信心,因为已知Delphi字符串变量有效,Copy
已知有效,并且已知字符串相等性测试有效。换句话说,在发生错误的代码行中没有错误。因此错误在其他地方。
一些可能有用的调试工具: