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