Vec::push 如何用于自引用类型?

问题描述 投票:0回答:1

引自

vec::push
实现:

pub fn push(&mut self, value: T) {
    // This will panic or abort if we would allocate > isize::MAX bytes
    // or if the length increment would overflow for zero-sized types.
    if self.len == self.buf.capacity() {
        self.buf.reserve_for_push(self.len);
    }
    unsafe {
        let end = self.as_mut_ptr().add(self.len);
        ptr::write(end, value);
        self.len += 1;
    }
}

这里如果

T
是自引用类型,那么如何保证
ptr::write
之后
end
处有一个有效的对象?

rust self-reference
1个回答
2
投票

在 Rust 中,所有类型都是可移动的,因此移动后必须有效;

ptr::write
本质上只是将值移动到新位置。

因此,自引用对象只能通过隐藏在某种保持其地址稳定的间接寻址后面来工作。除非你使用过

Pin
,否则你不能真正保证某些东西是稳定的。但无论如何,销钉本身仍然是可移动的,因此将一个销钉传递给
.push()
不是问题。如果自引用类型存在
.push()
问题,则表明该类型存在问题。

© www.soinside.com 2019 - 2024. All rights reserved.