Rust 切片指向自身数据的结构
我有一个结构Rust 切片指向自身数据的结构,rust,Rust,我有一个结构 struct Foo<'a> { buf: [u8, ..64], slice: &'a [u8] } 如果我尝试执行以下操作,借用检查器会抱怨(正确),因为切片的生存期将比结构短 impl<'a> Foo<'a> { fn new() -> Foo<'a> { let buf = [0, ..64]; Foo { buf: buf,
struct Foo<'a> {
buf: [u8, ..64],
slice: &'a [u8]
}
如果我尝试执行以下操作,借用检查器会抱怨(正确),因为切片的生存期将比结构短
impl<'a> Foo<'a> {
fn new() -> Foo<'a> {
let buf = [0, ..64];
Foo {
buf: buf,
slice: buf.slice_from(0)
}
}
}
然而,这个问题只是一个更为通用的用例的简化,即结构拥有数据,并对相同的数据进行引用,我想知道这是否可能(以安全的方式)在Rust中实现。不,你不能安全地实现它,因为一般来说,这样的结构是不可移动的。假设这是可能的,您可以创建这样的结构:
let foo = Foo {
buf: [0, ..64],
slice: obtain_slice_somehow()
};
slice
字段现在是buf
字段的一个切片,特别是,它包含一个指向当前位于堆栈上的buf
的指针。现在将foo
放入一个框中,并从函数返回:
return Box::new(foo);
foo
值现在移动到heap,函数退出,释放堆栈内存。然而,slice
指针并没有被调整为指向堆,因为一般来说这是不可能的,所以它悬空,违反了内存安全。我问了一个类似的问题(),不幸的是,似乎没有安全的方法来做这件事。我理解。然而,如果buf是一个Vec呢?然后指针将始终位于堆上,即使移动了foo也不会变得无效。我刚刚意识到vec当然可以随着其增长而重新分配,从而导致切片中的旧指针变得无效。然而,这样做似乎有可能愚弄借钱人。不过,我可能会添加另一个与此相关的问题。@dnaq,我怀疑是否有可能愚弄借阅检查器:)如果你能够,这肯定是rustc中的一个错误。我能够愚弄借阅检查器,错误报告是,相关的reddit帖子是。
let foo = Foo {
buf: [0, ..64],
slice: obtain_slice_somehow()
};
return Box::new(foo);