删除引用的对象后引用保持有效多长时间?

我正在阅读Common Rust Lifetime Misconceptions以了解生命周期是如何工作的,其中一个示例(下面发布)真的让我震惊,我无法说服自己为什么byte_1并且byte_2std::mem::drop(bytes);执行后仍然生活得很好。

从我的角度来看,在迭代器被删除后引用 whichbyte_1byte_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_1byte_2如果你能以某种方式删除所指对象b"1123"。但那是不可能的。b"1123"'static生命周期,'static对象不能被丢弃。


以上是删除引用的对象后引用保持有效多长时间?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>