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”行。
通常这类问题使用就(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命令的强制强制错误显示?
当内存被错误地覆盖时,错误将变得不稳定,就像在将记录写入未分配的内存区域时一样。 –
你是否可以用一个新项目复制它? –
什么类型是TempFTDB?如果错误发生在'TempFTDB:= nil'行,那么设置FTText来做什么呢? – NGLN
@NGLN - TempFTDB是一组记录。 FTText是记录的短字符串字段 –