0

我已经阅读了这里关于 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”行。

4

2 回答 2

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 命令的存在或不存在会强制显示错误?

于 2012-05-08T04:38:16.457 回答
0

通常在使用 IfThen 时出现这种问题是因为 IfThen 方法需要 2 个字符串,如您在方法签名中所见:

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

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

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

于 2012-05-07T16:08:21.283 回答