文章目录
- rust处理全局变量的策略
- 方法1:在main中自动Drop全局变量
- 参考
rust处理全局变量的策略
Rust 的静态变量不会在程序退出时自动调用 Drop,因为它们的生命周期与进程绑定。
use std::sync::OnceLock;
struct GlobalData {
content: String,
}
impl Drop for GlobalData {
fn drop(&mut self) {
println!("Cleaning up: {}", self.content);
}
}
static GLOBAL_DATA: OnceLock<GlobalData> = OnceLock::new();
fn main() {
GLOBAL_DATA.get_or_init(|| GlobalData {
content: "Hello, world!".to_string(),
});
println!("Program is running...");
// When the program exits, the Drop implementation for GlobalData is called.
}
Program is running...
方法1:在main中自动Drop全局变量
全局变量的生命周期应该和main的程序生命周期是一样长的,所以可以在main中创建一个CleanUp局部对象,为CleanUp()实现Drop特征,在Drop()特征中,完成释放全局变量的资源的功能。
struct Cleanup;
impl Drop for Cleanup {
fn drop(&mut self) {
//调用某些全局变量的释放方法 或者 C库中的方法
println!("Cleanup executed on program exit.");
}
}
fn main() {
let _cleanup = Cleanup; // The `Drop` method will be called when `_cleanup` goes out of scope
println!("Program is running...");
}
测试:
Program is running...
Cleanup executed on program exit.
eg:
use std::sync::OnceLock;
struct Cleanup;
impl Drop for Cleanup {
fn drop(&mut self) {
GlobalData::free();
println!("Cleanup executed on program exit.");
}
}
struct GlobalData {
content: String,
}
impl GlobalData{
pub fn free()
{
println!("GlobalData::free...");
}
}
static GLOBAL_DATA: OnceLock<GlobalData> = OnceLock::new();
fn main() {
GLOBAL_DATA.get_or_init(|| GlobalData {
content: "Hello, world!".to_string(),
});
let _cleanup = Cleanup; // The `Drop` method will be called when `_cleanup` goes out of scope
println!("Program is running...");
}
Program is running...
GlobalData::free...
Cleanup executed on program exit.