Delphi XE中的指针操作无效 - 因为IFTHEN?

时间:2012-05-06 17:45:55

标签: delphi pointers delphi-xe dynamic-arrays if-statement

我已经阅读了大部分关于Delphi中无效指针操作的帖子,它们似乎不适用于这种情况......试验和错误导致我遇到问题,但它没有任何意义对我来说。在此示例中,在解析文本文件时,将使用文本文件的内容填充动态记录数组。除非分配给动态数组的内存被释放,否则一切都会正常工作 - 在这种情况下,我会收到“无效的指针操作”。当我将有问题的行从ifthen语句更改为经典if-then时,它可以正常工作。

我的问题很简单:为什么第一个导致它无法释放内存但是第二个成功?

第一个例子:

TempFTDB[ci].FTText := ifthen(TempHolder = '', '', TempHolder + #13#10) + lr;

第二个例子:

if tempholder = '' then
    TempFTDB[ci].FTText := lr
else
    TempFTDB[ci].FTText := tempholder + #13#10 + lr;

释放内存的行是:

TempFTDB := nil;

进一步澄清:TempFTDB是一个局部变量,没有其他行可以释放它的内存。错误发生在“TempFTDB:= nil”行上。

2 个答案:

答案 0 :(得分:0)

使用IfThen时通常会出现这种问题,因为IfThen方法需要2个字符串,正如您在方法签名中看到的那样:

function IfThen(AValue: Boolean; const ATrue: string; AFalse: string = ''): string;

我不知道您发布的代码是否是实际代码,但我可以猜测“False”值处于错误状态,而IfThen方法将执行两个条件,总是

因此,如果您在“False”值中传递方法,并且此方法取决于您的条件为false而无法执行,这可能会导致意外行为,因为它将始终被执行。

答案 1 :(得分:0)

好的......事实证明,以上是一种红鲱鱼。每当上面提到的例程(上面摘录)第二次运行时,错误就会回来 - 当然听起来像未分配的内存......就在上面的代码之前是一个例程,用于重新编号临时记录数组中的项目,其中是问题...(一个令人尴尬的小错误..)

我有:

for i := 0 to length(FTDBFileBuffer_RTF) do
  begin
    FTDBFileBuffer_RTF[i].RecordNo := NewRecordNumber;
  end;

而不是

for i := 0 to length(FTDBFileBuffer_RTF) - 1 do //notice the - 1
  begin
    FTDBFileBuffer_RTF[i].RecordNo := NewRecordNumber;
  end;

现在问题只是学术问题...... 为什么 ifthen命令的存在与否会强制显示错误?