【问题标题】:Invalid Pointer Operation in Delphi XE - Because of IFTHEN?Delphi XE 中的无效指针操作 - 因为 IFTHEN?
【发布时间】:2012-05-06 17:45:54
【问题描述】:

我已经阅读了大多数关于 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”行。

【问题讨论】:

  • 你能用新项目复制这个吗?
  • TempFTDB 是什么类型的?如果错误发生在TempFTDB := nil 行,那么设置FTText 与它有什么关系?
  • @NGLN - TempFTDB 是一个记录数组。 FTText 是记录的短字符串字段

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


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    我有:

    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-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多