gpt4 book ai didi

rust - 进行不安全转换时如何限制生命周期

转载 作者:行者123 更新时间:2023-12-05 02:35:03 26 4
gpt4 key购买 nike

我想从具有相同大小的数组 ref 创建一个 Test ref 并保持生命周期检查。
我可以通过使用一个函数来做到这一点,我知道这个函数可以推断出生命周期。由于移动后使用,下面的代码有意设计为在编译时失败。它有效。

struct Test {
a: i32,
}

/// 'a can be removed for simplification
fn create_test<'a>(ptr: &'a mut [u8]) -> &'a mut Test {
assert_eq!(ptr.len(), size_of::<Test>());
unsafe { &mut *(ptr as *mut [u8] as *mut Test) }
}

fn main() {
let mut space = Box::new([0 as u8; 100]);
let (s1, _s2) = space.split_at_mut(size_of::<Test>());

let test = create_test(s1);
drop(space);

test.a += 1;
}

我的问题是如何在不声明额外函数来限制生命周期的情况下执行此操作。

fn main() {
let mut space = Box::new([0 as u8; 100]);
let (s1, _s2): (&'a mut [u8], _) = space.split_at_mut(size_of::<Test>());
let test: &'a mut Test = unsafe { &mut *(s1 as *mut [u8] as *mut Test) };
drop(space);
}

这样的`a是不允许的。

最佳答案

以下代码有效。它持有借款支票。

fn main() {
let mut space = Box::new([0 as u8; 100]);
let layout = Layout::new::<Test>();
println!("{}", layout.align());
let (_prefix, tests, _suffix) = unsafe { space.align_to_mut::<Test>() };
assert!(tests.len() > 0);
let test = &mut tests[0];
let (_, suffix, _) = unsafe { tests[1..].align_to_mut::<u8>() };
}

关于rust - 进行不安全转换时如何限制生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70639310/

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