Rust含可变引用数组的结构体生命周期问题求助
Rust 生命周期问题:临时数组的生命周期不足
你的代码存在核心问题:new 函数里创建的 [1u8, 2u8] 和 [3u8, 4u8, 5u8] 是临时栈数组,它们的生命周期仅局限于当前表达式,而你试图将指向这些临时数组的可变切片存入 Data 结构体并返回,这违反了 Rust 的生命周期规则——结构体持有的引用不能比被引用的数据存活更久。
以下是两种可行的解决方式:
方案一:结构体直接持有数据(无需引用)
如果不需要引用语义,直接让结构体持有堆分配的数组(用 Vec),彻底规避生命周期问题:
struct Data { f: [Vec<u8>; 2], } impl Data { fn new() -> Self { let mut p = Self { f: [vec![1u8, 2u8], vec![3u8, 4u8, 5u8]], }; p.f[0][1] = 5; p.f[1][2] = 7; p } } fn main() { let v = Data::new(); println!("{:?}", v.f); }
方案二:确保引用数据的生命周期足够长
如果必须使用引用,需要让被引用的数据拥有比结构体更长的生命周期,比如将数据放在调用方(main 函数)中,再传递给 Data:
struct Data<'a> { f: [&'a mut [u8]; 2], } impl<'a> Data<'a> { fn new(f0: &'a mut [u8], f1: &'a mut [u8]) -> Self { let mut p = Self { f: [f0, f1], }; p.f[0][1] = 5; p.f[1][2] = 7; p } } fn main() { let mut arr0 = [1u8, 2u8]; let mut arr1 = [3u8, 4u8, 5u8]; let v = Data::new(&mut arr0, &mut arr1); println!("{:?}", v.f); }
内容的提问来源于stack exchange,提问作者Evgeny Pogorelov
相关产品推荐
相关产品推荐

