struct MyStruct<'a> {
data: &'a i32
}
static MY_INT: i32 = 10;
static MY_STRUCT: MyStruct = MyStruct { data: &MY_INT };
fn main() {
println!("The value in MyStruct is: {}", MY_STRUCT.data);
}
静态值存储特性与生命周期的交互
- 静态值存储:
MY_INT
是一个静态变量,它存储在程序的静态存储区,整个程序运行期间都存在。其生命周期与程序相同。
- 结构体生命周期:
MyStruct
实例 MY_STRUCT
也是静态的,它同样存储在静态存储区。MY_STRUCT
中的 data
引用指向 MY_INT
。由于 MY_INT
是静态的,其生命周期足够长,所以 MyStruct
实例可以安全地持有对 MY_INT
的引用。
可能遇到的陷阱
- 生命周期不匹配:如果
MyStruct
指向的不是静态变量,就会出现生命周期不匹配的问题。例如,如果 data
指向一个函数内部的局部变量,局部变量在函数结束时就会被销毁,而 MyStruct
可能在函数结束后仍然存在,这会导致悬空引用。
- 线程安全:静态变量在多线程环境下需要特别小心。如果多个线程同时访问和修改静态变量(包括通过
MyStruct
访问 MY_INT
),可能会导致数据竞争。在 Rust 中,默认情况下静态变量是不可变的,这在一定程度上避免了数据竞争。如果需要可变的静态变量,需要使用 Mutex
或 RwLock
等同步原语。