Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
delphi中的FindClose_Delphi - Fatal编程技术网

delphi中的FindClose

delphi中的FindClose,delphi,Delphi,我见过一个Delphi 6程序,它在函数中使用来自SysUtils的FindFirst()。这是一个运行数月并执行数百次此操作的程序。令人惊讶的是,FindClose()没有被调用,也没有发生什么不好的事情 如果我理解正确,该程序似乎泄漏了文件句柄。(在TSearchRec记录中有一个THandle条目。整个记录被丢弃,THandle未关闭)。问题是似乎没有问题。我使用process explorer表单sysinternal,发现FindFirst未找到文件的打开文件句柄 有什么解释吗 如上所

我见过一个Delphi 6程序,它在函数中使用来自SysUtils的
FindFirst()
。这是一个运行数月并执行数百次此操作的程序。令人惊讶的是,
FindClose()
没有被调用,也没有发生什么不好的事情

如果我理解正确,该程序似乎泄漏了文件句柄。(在
TSearchRec
记录中有一个
THandle
条目。整个记录被丢弃,
THandle
未关闭)。问题是似乎没有问题。我使用process explorer表单sysinternal,发现
FindFirst
未找到文件的打开文件句柄


有什么解释吗

如上所述,您的程序泄漏句柄。如果调用
FindFirst
,但随后未调用
FindClose
,则会泄漏句柄。如果做得足够多,程序将耗尽可用的句柄对象并失败

你没有看到这一点表明你还没有达到极限。如果您没有从Process Explorer中观察到泄漏,则表明您查看的信息不正确。或者您完全错误地诊断了问题,没有调用泄漏的代码,或者调用了
FindClose
,但您尚未找到它


与其花更多的时间分析,不如修复代码。底线是,除非您将对
FindFirst
的调用与对
FindClose
的调用相匹配,否则您的程序会泄漏。

或者可能是程序耗尽了句柄,但对于topic starter来说,它看起来“没有什么不好的事情发生”。事实上,如果FindFirst无法打开手柄,它将在没有大爆炸的情况下失败。它不会抛出异常或操作系统sygnal——它只会返回错误条件,什么也不做。它可以运行一周,看起来没有什么不好的事情发生,只是程序的一部分不再被调用了。@Arioch'我认为句柄来自一个公共池。一旦你耗尽了它们,你就会在别处失败。@SpyrosKomninos一如既往,是你的朋友。如果句柄无效或函数因任何原因失败,则返回值为零。如果返回值为零(函数失败),您可以通过调用
GetLastError
,以常规方式检查扩展错误信息。这是
Windows.FindClose
,@J..的文档,而这里的主题是
SysUtils.FindClose
。后者不返回任何内容,对错误用法保持沉默。但来源仍然可以是你的朋友,根据我的版本来源,在同一个
TSearchRec
上调用
SysUtils.FindClose
两次是不可行的。编写代码非常容易,以确保只调用FindClose一次。相关:也相关:请注意,如果FindFirst找不到匹配项,它会关闭句柄本身。还要注意,几个月内数百次并不多。一分钟数百次是有意义的。Windows会在经过一段时间后释放孤立句柄,而不会对其进行访问。过去6个月我花了1000美元买咖啡,这周我花了1000美元买咖啡,这两者之间有很大区别。超过6个月,你的银行账户可能不会注意到这么多,因为你每隔两周就要存款一次;本周可能会。手柄的限制是什么?它曾经是在数千左右。如果你有一个额外的累积泄漏,那么我看到一个问题。累积泄漏是指“Windows释放孤立句柄”不会发生。真的吗?我不知道。我得找关于那件事的参考资料。