gpt4 book ai didi

pointers - 在使用 no_std 删除指针之前防止删除

转载 作者:行者123 更新时间:2023-11-29 08:12:40 26 4
gpt4 key购买 nike

我有一个存储指向某些数据的原始指针的结构:

struct Foo<T> {
x: *const T
}

impl<T> Foo<T> {
fn new(x: &[T]) -> Foo<T> {
Foo {
x: &x[0] as *const T
}
}
}

数据其实是一个slice,但是我使用了offset的方式来避免直接存储数据。构造函数将指向数据的指针放入字段中,并返回结构。但是,如果我尝试从函数返回 Foo:

fn foo() -> Foo<i32> {
let x = [1, 2, 3];
Foo::new(&x)
}

fn main() {
unsafe {
println!("{}", &*foo().x);
}
}

数据过早丢弃,字段x指向垃圾。我想要发生的是克隆数据 x 指向的数据,并且克隆的生命周期与结构一样长。我怎样才能做到这一点?

最佳答案

你不知道。

您正在尝试转义指向堆栈数据的指针,如果您使用的是常规借用指针,Rust 会禁止您这样做。但是,通过使用原始指针和 unsafe ,您已经有效地剥离了编译器通常会强制执行的各种保护。

你真的,真的不应该使用 unsafe除非你明白发生了什么。

如果不将函数中创建的东西移出,您也无法延长它的生命周期。根本没有办法传递x 的指针(或借用) .

解决这个问题的方法是一开始就这样做。使用借用的指针(&i32&[i32])或拥有的值(i32Vec<i32>)。

另一种可能性是在调用者 中分配必要的存储空间并传递一个&mut。进入foo ,然后您可以对其进行切片、变异并将借用的子切片归还。当然,这要求您可以静态地定义空间大小的上限 foo会需要,但这就是没有std的生活.

关于pointers - 在使用 no_std 删除指针之前防止删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35521601/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com