这个Peter Below代码是内存泄漏吗?

时间:2015-08-30 11:37:49

标签: delphi

我知道我不应该问Peter Peter,但是我在尝试调试一些旧的D5代码时发现了这段代码片段Text File Size

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

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

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;

3 个答案:

答案 0 :(得分:7)

  

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

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

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

  

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

此功能对所有类型的文件以完全相同的方式运行。

  

更好的Delphi.FileSize(fname:string); ?

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

答案 1 :(得分:4)

只有在FindClose成功时才需要调用{p> FindFirst,如其返回值0所示。这正是他在这里所做的..请参阅here或Delphi帮助文件

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

答案 2 :(得分:0)

  

如果结果为零,是不是建立了FindFirst并挂起?

没有。 FindFirst()返回错误代码,其中0表示成功,而不是失败。 TextFileSize()为其Result分配值时,FindFirst()不会立即退出,代码会继续运行。因此,如果Result成功,则为FindClose()分配文件大小值,然后正确调用TSearchRec以清除var headerIndex = 1; var addHeader = function(){ $('#mainDiv').prepend("<h4>Header number: " + (headerIndex++) + "</h4>"); }; 并按预期关闭搜索句柄。