I have a web application written in Rust and wasm-bindgen that needs to store state. The state is stored like this:
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>,
}
I attempted the following to remove the data and free the memory, and the data is removed from the HashMap
and no errors are reported:
#[wasm_bindgen]
pub fn remove_data(id: u32) {
match ID_TO_DATA.lock().unwrap().remove(&id) {
Some(data) => {
std::mem::drop(data);
}
None => {}
}
}
However, the memory used by the browser tab never drops (using Chrome 67). I used Windows' Task Manager and watched the memory grow to almost 2GB for the relevant process/tab, and then after my program removed all the entries, I waited a minute and the memory was still at almost 2GB.
I also tried the following, but got this error: 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 => {}
}
}
How can I successfully free this memory?