考虑以下代码:
f, err := os.Create(tmpFilepath)
defer f.Close()
// do some writing to f
os.Rename(tmpFilepath, newpath)
为简化起见,已删除了一些错误处理。
此外,我知道这段代码是错误的,但是我试图理解这段代码对文件的正确性和性能的影响。
这里有资源泄漏吗?
顺便说一句,解决方法是在完成写入文件后关闭。
答案 0 :(得分:3)
如果我们正在讨论实现POSIX语义的操作系统和文件系统(也就是说,不是Windows,通常不允许您重命名打开的文件),则绝对没有问题:打开的文件描述符仅算作硬链接文件的数据。
重命名文件的数据不会以某种方式与打开的文件描述符分离-将后者视为对该数据的一种“匿名”引用。
如果文件的链接计数为0,则当与该文件关联的所有文件描述符都关闭时,该文件所占用的空间将被释放,并且该文件将不再可访问。