我正在尝试编写一个缓冲区用于解析,所以我可以在解析它们时从前面拉出记录,理想情况下不会制作任何副本,只是在运行时将缓冲区前面的块的所有权转移掉.这是我的实现:
struct BufferThing {
buf: Vec<u8>,
}
impl BufferThing {
fn extract(&mut self, size: usize) -> Vec<u8> {
assert!(size <= self.buf.len());
let remaining: usize = self.buf.len() - size;
let ptr: *mut u8 = self.buf.as_mut_ptr();
unsafe {
self.buf = Vec::from_raw_parts(ptr.offset(size as isize), remaining, remaining);
Vec::from_raw_parts(ptr, size, size)
}
}
}
Run Code Online (Sandbox Code Playgroud)
这会编译,但signal: 11, SIGSEGV: invalid memory reference在开始运行时会发生恐慌.这与Nomicon中的示例大致相同,但我试图在它上面做Vec,我试图分割一个字段而不是对象本身.
是否可以在不复制其中一个的情况下执行此操作Vec?Nomicon或其他文档中是否有一些部分可以解释为什么我要把所有内容都搞砸了unsafe?