我不明白当Rust处理文件句柄超出作用域时会发生什么。例如,我创建一个文件并写入几个单词:
let wd = os::getcwd().unwrap_or(Path::new("/"));
let mut file = File::create(&Path::new("daemon_log.txt"));
file.write_all(format!("DAEMON CWD: {}", wd.as_str().unwrap_or("some problems")).as_bytes());
在文件超出范围的地方,编译器应该插入释放内存的指令。如果我对阻塞IO通常的实现方式的理解是正确的,那么除了释放内存之外,进程还应该释放一些锁。
我担心的是,在
File
的源代码中,我找不到任何提示让编译器这样做。这篇旧文章说所有魔法都在为File
实现Drop
特征,但现在似乎不是这样,因为我在std::ops.rs
和std::old_io::fs.rs
中都找不到Drop
特征的实现。
更新
我再次检查了 File
的 write_all
实现,并发现 write
方法使用了一些描述符(FileDesc
)。我在文档中没有找到任何相关信息,于是去 GitHub 上找到了 this。它看起来是我问题的答案,但我被评论中的一行困惑了:
这是什么意思?我永远不应该自己调用// closing stdio file handles makes no sense, so never do it
libc::close
吗?还是他们自己也不确定应该如何实现?