支援弱參考
預設情況下,如果偵測到支援,wasm-bindgen 會使用 TC39 弱參考提案。在撰寫本文時,所有主要瀏覽器都支援它。
沒有弱參考,您的 JS 整合可能會在 Rust 中容易出現記憶體洩漏,例如
- 您可能會忘記在 JS 物件上呼叫
.free()
,導致 Rust 記憶體被分配。 - 轉換為 JS 值的 Rust 閉包 (
Closure
類型) 可能不會被執行和清除。 - Rust 閉包具有
Closure::{into_js_value,forget}
方法,這些方法明確地不釋放底層記憶體。
這些問題都可以透過 JS 中的弱參考提案解決。FinalizationRegistry
將確保所有記憶體都被清除,無論它是否被明確釋放。請注意,明確釋放始終是一種可能性並且受到支援,但是如果沒有呼叫它,那麼如果偵測到 FinalizationRegistry
支援,記憶體仍將自動釋放。