Delphi 这段代码是不是内存泄漏?

Delphi 这段代码是不是内存泄漏?,delphi,Delphi,我知道我不应该在下面质疑Peter,但我只是在调试一些旧的D5代码时发现了这个代码片段 在我看来,Sysutils.FindClose应该作为函数的最后一行被调用。如果结果为零,那么FindFirst是否会建立并挂起 更多问题:它声明这是用于文本文件的,但不能用于任何文件类型吗?更好的Delphi.FileSize(fname:string) 仅当FindFirst成功时,才需要调用FindClose,如其返回值0所示。这正是他在这里做的。。请参阅Delphi帮助文件中的或 事实上,它适用于所有

我知道我不应该在下面质疑Peter,但我只是在调试一些旧的D5代码时发现了这个代码片段

在我看来,Sysutils.FindClose应该作为函数的最后一行被调用。如果结果为零,那么FindFirst是否会建立并挂起

更多问题:它声明这是用于文本文件的,但不能用于任何文件类型吗?更好的Delphi.FileSize(fname:string)


仅当
FindFirst
成功时,才需要调用
FindClose
,如其返回值0所示。这正是他在这里做的。。请参阅Delphi帮助文件中的或

事实上,它适用于所有类型的文件,而不仅仅是文本文件

在我看来,Sysutils.FindClose应该作为函数的最后一行被调用。如果结果为零,那么FindFirst是否会建立并挂起

否。如果
FindFirst
失败,则不需要调用
FindClose
。对于Delphi的现代版本,无论
FindFirst
的结果如何,都可以安全地调用它。对于旧版本的Delphi,需要问题中的条件代码。没关系,这里没有漏洞

不幸的是,文件没有明确说明这一点。确保这一点的唯一方法是阅读源代码

它说明这是针对文本文件的,但这不能用于任何文件类型吗

对于所有类型的文件,此函数的操作方式完全相同

更好的Delphi.FileSize(fname:string)

我不知道你指的是哪个函数,但你问题中的函数有两个弱点。首先,它返回一个32位有符号整数,因此对于大于2GB的文件给出错误的输出。其次,它从文件系统元数据中读取文件大小,这可能并不总是与真正的文件大小匹配。后一个问题可能不是你应该关心的。使用存储在文件系统元数据中的文件大小通常是非常合理的

如果结果为零,那么FindFirst是否会建立并挂起


否。
FindFirst()
返回错误代码,其中0表示成功,而不是失败
TextFileSize()
在为其
结果
赋值时不会立即退出,代码将继续运行。因此,如果
FindFirst()
成功,则为
Result
分配文件大小值,然后正确调用
FindClose()
以清理
TSearchRec
并按预期关闭搜索句柄。

1)否。只有
FindFirst
成功时,才需要调用
FindClose
。2) 当然,它适用于任何文件类型。3) 对于这样的原型,
FileSize
是什么?你可以向任何人提问。至少你会学到一些东西。FWIW,在Delphi 5之后的版本中,IIRC,
FindClose
被修改,因此你可以随时调用它,即使
FindFirst
失败,但你不必这样做。
function TextfileSize(const name: string): LongInt;
var
  SRec: TSearchRec;
begin
  if FindFirst(name, faAnyfile, SRec) = 0 then
  begin
    Result := SRec.Size;
    Sysutils.FindClose(SRec);
  end
  else
    Result := 0;
end;