是否使用Ruby;文件";类而不关闭泄漏内存?

是否使用Ruby;文件";类而不关闭泄漏内存?,ruby,io,Ruby,Io,所以我对Ruby中的文件类做了一些研究。在我挖掘的过程中,我了解到File是IO的一个子类。据我所知,当您创建一个IO对象(或File对象)时,会为该文件打开一个缓冲区,允许您读取和写入该文件。我不完全理解缓冲区是什么,但很明显,在调用对象上的#close方法之前,它一直处于打开状态。据我所知,无论您调用File.new还是File.open,此缓冲区都是打开的(如果我有任何错误,请纠正我) 假设您喜欢使用文件类来处理路径和类似的内容: f = File.new('spec/tmp/testfi

所以我对Ruby中的
文件
类做了一些研究。在我挖掘的过程中,我了解到
File
IO
的一个子类。据我所知,当您创建一个
IO
对象(或
File
对象)时,会为该文件打开一个缓冲区,允许您读取和写入该文件。我不完全理解缓冲区是什么,但很明显,在调用对象上的
#close
方法之前,它一直处于打开状态。据我所知,无论您调用
File.new
还是
File.open
,此缓冲区都是打开的(如果我有任何错误,请纠正我)

假设您喜欢使用
文件
类来处理路径和类似的内容:

f = File.new('spec/tmp/testfile.md')
File.basename(f)
但是你永远不会调用
f.close
。保留此缓冲区是否会泄漏内存?如果我为文件系统中的一棵树多次调用这个函数,我会陷入困境吗

谢谢你的回复

PS我知道您可以只使用
File.basename('spec/tmp/testfile.md')
来代替,我只是把它作为一个例子

是的 除了
sys*
操作系列之外,Ruby的IO操作最终分配文件描述符和缓冲区

如果您没有关闭
IO
对象,那么您是正确的。。。您很可能同时泄漏fd和缓冲区

现在,如果您以覆盖或以其他方式结束旧引用的生命周期的方式分配它,那么Ruby可以g/c整个对象。这肯定会释放缓冲区,最终也会释放FD

然而,在所有语言中,依赖g/c触发的终结器被认为是非常糟糕的做法,因为它无法预测需要多长时间以及一次将存在多少优秀的OS级资源。在g/c机器启动之前,您可能会超过某些本地限制

一般规则是同步分配和释放操作系统资源



只要我把这个话题打得死去活来,就有一个例外。如果您要分配固定数量的描述符或其他东西,并且它们必须同时存在,并且程序将在完成其工作后退出,那么只需保留它们就可以了。操作系统会清理一切。例如,最好不要在退出之前释放内存。如果程序即将退出,则管理堆所需的处理将完全浪费。操作系统将把程序的每一页都放在它的免费列表上。这是一个例外。如果是作业,我会释放所有内容。

关闭文件以释放文件指针。并避免意外覆盖数据。不适用于内存泄漏。。但无论如何还是要关闭它们。谢谢@numbers1311407似乎我还需要了解更多关于I/O的信息。你们都知道关于这个主题或“文件指针”的好文章吗?不知道。Ruby将对其进行GC,并释放底层结构。不过,它并没有考虑GC操作之间的延迟,这是不及时的。至于意外覆盖数据,GC与此无关。