引自
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 中,所有类型都是可移动的,因此移动后必须有效;
ptr::write
本质上只是将值移动到新位置。
因此,自引用对象只能通过隐藏在某种保持其地址稳定的间接寻址后面来工作。除非你使用过
Pin
,否则你不能真正保证某些东西是稳定的。但无论如何,销钉本身仍然是可移动的,因此将一个销钉传递给 .push()
不是问题。如果自引用类型存在 .push()
问题,则表明该类型存在问题。