删除引用的对象后引用保持有效多长时间?
我正在阅读Common Rust Lifetime Misconceptions以了解生命周期是如何工作的,其中一个示例(下面发布)真的让我震惊,我无法说服自己为什么byte_1并且byte_2在std::mem::drop(bytes);执行后仍然生活得很好。
从我的角度来看,在迭代器被删除后引用 whichbyte_1和byte_2hold 应该是无效的,bytes因为remainder数组也被删除了,编译器应该将drop操作视为错误,但实际上它通过编译器并且运行没有问题.. .
希望有人能给来自C++/C#的程序员一个合理的解释,谢谢!
struct ByteIter<'remainder> {
remainder: &'remainder [u8]
}
impl<'remainder> ByteIter<'remainder> {
fn next(&mut self) -> Option<&'remainder u8> {
if self.remainder.is_empty() {
None
} else {
let byte = &self.remainder[0];
self.remainder = &self.remainder[1..];
Some(byte)
}
}
}
fn main() {
let mut bytes = ByteIter { remainder: b"1123" };
let byte_1 = bytes.next();
let byte_2 = bytes.next();
std::mem::drop(bytes); // we can even drop the iterator now!
if byte_1 == byte_2 { // compiles
// do something
}
}
(我已经学习 Rust 一个月了,但还是被很多新概念搞糊涂了)
回答
bytes不拥有b"1123"。它只有对它的引用。因为没有所有权,bytes所以 drop 不 drop b"1123"。删除bytes的引用不会影响具有相同生命周期的其他引用。
现在你可以无效byte_1,byte_2如果你能以某种方式删除所指对象b"1123"。但那是不可能的。b"1123"有'static生命周期,'static对象不能被丢弃。