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