0

File所以我正在对Ruby中的类进行一些研究。当我在挖掘时,我了解到这FileIO. 据我了解,当您创建一个IO对象(或File对象)时,会为该文件打开一个缓冲区,允许您读取和写入该文件。我不完全理解缓冲区是什么,但显然它会保持打开状态,直到您调用#close对象上的方法。据我了解,无论您打电话File.new还是File.open(如果我在这方面有任何错误,请纠正我),这个缓冲区都会打开。

所以说你喜欢将File类用于路径和类似这样的东西:

f = File.new('spec/tmp/testfile.md')
File.basename(f)

但你从不打电话f.close。让这个缓冲区打开泄漏内存吗?如果我为文件系统中的一棵树调用了数百次,我会遇到大麻烦吗?

感谢您的回复!

PS我知道你可以File.basename('spec/tmp/testfile.md')改用,我只是用这个作为例子

4

1 回答 1

1

是的

除了sys*操作族之外,Ruby 的 IO 操作最终会同时分配文件描述符和缓冲区。

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

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

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

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


只要我把对象打死,就有例外。如果你要分配固定数量的描述符什么的,而且无论如何它们都必须同时存在,并且程序在完成工作后要退出,那么离开它们就可以了。操作系统清理一切。例如,最好不要在退出前释放内存。如果程序即将退出,管理堆所需的处理就完全浪费了。操作系统只是将程序的每一页都放在它的空闲列表中。并且有一个例外的例外。如果是家庭作业,我会释放一切。

于 2012-11-13T05:34:52.287 回答