弱引用支持
默认情况下,如果检测到支持,wasm-bindgen 会使用 TC39 弱引用提案。在撰写本文时,所有主流浏览器都支持它。
没有弱引用,您的 JS 集成可能会在 Rust 中容易出现内存泄漏,例如
- 您可能会忘记在 JS 对象上调用
.free()
,从而导致 Rust 内存被分配。 - 转换为 JS 值的 Rust 闭包(
Closure
类型)可能不会被执行和清理。 - Rust 闭包具有
Closure::{into_js_value,forget}
方法,它们明确地不释放底层内存。
这些问题都通过 JS 中的弱引用提案得到解决。FinalizationRegistry
将确保所有内存都被清理,无论它是否被显式释放。请注意,显式释放始终是可能的并且受支持,但如果它没有被调用,那么如果检测到 FinalizationRegistry
支持,内存仍然会自动释放。