我试图写一个小型的缓冲区来进行解析,这样我就可以在解析时从前面获取记录,理想情况下不需要做任何副本,只需将缓冲区前端的块所有权转移出去即可。以下是我的实现:
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)
}
}
}
这段代码编译通过后,在运行时却出现了signal: 11, SIGSEGV: invalid memory reference
的错误。这段代码基本上与Nomicon中的例子相同,但我试图在Vec
而不是对象本身上拆分字段。
是否可能在不复制其中一个Vec
的情况下完成此操作?是否有Nomicon或其他文档的某个部分可以解释为什么我在unsafe
块中炸毁了一切?
unsafe
代码是安全的,那么使用它是一个非常糟糕的想法。 - Shepmaster