关于wasm-bindgen内存管理的疑问:为何示例未调用free()?
wasm-bindgen struct内存管理:为什么有的示例不用调用free()
核心原因在于导出的struct是否包含堆分配资源,以及它的内存分配方式:
当《Exporting a struct to JS》章节说“必须调用free函数释放Rust侧资源”时,针对的是**包含堆分配数据(比如
String、Vec)或者被标记为堆分配(#[wasm_bindgen(boxed)])**的struct。这类struct被导出到JS时,JS拿到的是Wasm堆内存中的指针——Rust的所有权系统无法追踪JS侧的引用生命周期,所以必须手动调用free()来释放Rust侧的堆资源,否则会造成内存泄漏。《Exported struct types》的示例里,
return_named_struct(42)返回的是仅包含基本类型的struct,比如:#[wasm_bindgen] pub struct NamedStruct { x: u32, } #[wasm_bindgen] pub fn return_named_struct(x: u32) -> NamedStruct { NamedStruct { x } }这种struct是Rust的Copy类型,wasm-bindgen会直接把值复制到JS侧,JS拿到的是独立的副本。Rust侧的原始值会在函数返回后自动被栈回收,不存在需要手动释放的Rust侧资源,所以示例里不需要调用
free()。额外验证:如果给示例的struct加上堆分配字段(比如
String),生成的JS绑定会自动带上free()方法,此时文档就会明确要求你调用它;而Copy类型的struct,生成的JS绑定里甚至不会有free()方法。
内容的提问来源于stack exchange,提问作者mti
相关产品推荐
相关产品推荐

