我有一个用Rust和wasm-bindgen编写的Web应用程序需要存储状态。状态是这样存储的:
lazy_static! {
static ref ID_TO_DATA: Mutex<HashMap<u32, Data>> = Mutex::new(HashMap::new());
}
pub struct Data {
pub coder_id: u16,
pub bools: Vec<bool>,
pub ints: Vec<i32>,
pub strings: Vec<String>,
}
我尝试了以下方法来删除数据并释放内存,HashMap
中的数据已被删除,且未报告任何错误:
#[wasm_bindgen]
pub fn remove_data(id: u32) {
match ID_TO_DATA.lock().unwrap().remove(&id) {
Some(data) => {
std::mem::drop(data);
}
None => {}
}
}
然而,浏览器选项卡使用的内存从不下降(使用Chrome 67)。我使用了Windows任务管理器并观察到相关进程/选项卡的内存增长近2GB,然后在我的程序删除所有条目后等待了一分钟,内存仍然接近2GB。我还尝试了以下操作,但收到了此错误:RuntimeError:memory access out of bounds
。#[wasm_bindgen]
pub fn remove_data(id: u32) {
match ID_TO_DATA.lock().unwrap().remove(&id) {
Some(mut data) => {
unsafe {
std::ptr::drop_in_place(&mut data);
}
}
None => {}
}
}
我该如何成功释放这段内存?
std::mem::drop
是如何实现的,以避免误用。 - E net4remove_data
方法可以编写为ID_TO_DATA.lock().unwrap().remove(&id);
。没有调用drop
,也没有match
。 - Shepmaster