Delphi XE中的无效指针操作 - 由于IFTHEN?

问题描述:

我已阅读了大多数关于Delphi中无效指针操作的帖子,它们似乎并不适用于这种情况......试错法导致我遇到了问题,但它没有任何意义我。在这个例子中,一个动态的记录数组在解析它时填充了一个文本文件的内容。除非分配给动态数组的内存被释放 - 在这种情况下,我会收到“无效的指针操作”。当我将ifthen语句中的问题从if语句更改为经典if语句时,它可以工作。Delphi XE中的无效指针操作 - 由于IFTHEN?

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

第一示例:

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”行。

+0

你是否可以用一个新项目复制它? –

+1

什么类型是TempFTDB?如果错误发生在'TempFTDB:= nil'行,那么设置FTText来做什么呢? – NGLN

+0

@NGLN - TempFTDB是一组记录。 FTText是记录的短字符串字段 –

通常这类问题使用就(ifthen)时,是因为(ifthen)法预计2串,你可以在方法签名中看到:

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

我不知道,如果你发布的代码是实际代码,但我可以猜测“False”值处于错误状态,并且IfThen方法始终会执行条件,两者均为条件。

所以如果你传递的是一个“False”值的方法,并且这个方法取决于你的条件为false,它会被执行,这可能会导致意外的行为,因为它会执行总是

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

我:

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; 

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

+0

当内存被错误地覆盖时,错误将变得不稳定,就像在将记录写入未分配的内存区域时一样。 –