Closuresを使用してJavaScriptにコールバックを提供するとき、それらを解放しないように対処するためのより良い方法は何ですか?wasm-bindgenガイドを使用して示唆し.forget
、それは本質的にメモリをリークしていることを認めています。
通常は、後で適切なタイミングでドロップされるようにハンドルを格納しますが、今のところ、それをグローバルハンドラーにして、
forget
メソッドを使用して、クロージャーを無効にすることなくそれをドロップします。これはRustでメモリリークを起こしているので注意してください。
これは、ドロップするのが適切になるまでクロージャーを保管することを示します。でalexcrichtonの答えに、前の質問に、彼は言及します...
[...]一度しか呼び出されない場合は、[
Rc
/]RefCell
を使用しClosure
て、クロージャー自体の内部をドロップできます(内部の可変性シェナンを使用します)。
しかし、彼はこの方法の例を提供していません。
閉鎖のマニュアルには、参照を解放するときに処理させるためにはJavaScriptコンテキストに閉鎖への参照を返す例を示します。
cb
ここにドロップすると、間隔が経過するたびに例外が発生します。代わりに、私たちは、返し JSが間隔をキャンセルし、閉鎖を解放する際に決めることができるように私たちのハンドルバックはJSに。
また#[wasm_bindgen]
、この問題を回避するために、パブリック関数のライフタイムやマクロなどの機能を使用する方法もあると思いますが、その方法を理解するのに苦労しています。
私の質問は、.forget
RustからJavaScriptに返されるクロージャーを使用する代わりの選択肢は何ですか?また、使用中の各オプションの簡単な例をいくつか見ていただけますか?