我已经阅读了大部分关于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”行上。
答案 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命令的存在与否会强制显示错误?