C++オブジェクトとJavascriptオブジェクトのライフサイクルの同期ミスについて質問がありました。ここであなたの教祖が私を助けてくれることを願っています。
具体的には、C++プログラムにSpiderMonkeyを埋め込んでいます。私のアプローチが正しいかどうかはわかりません。私がやっていることは
(1)C ++プログラムはJavascriptファイルをロードし、エントリ関数を呼び出します。
(2)エントリ関数では、プログラムを初期化するためにいくつかのC++関数が呼び出されます。これらの呼び出し中に、いくつかのC++オブジェクトが作成されます。
(3)ユーザーの操作に基づいて、対応するスクリプト関数がイベントハンドラーとして呼び出されます。
このアプローチは機能しますが、1つの問題があります(さらに不明な点がある可能性があります:)
あれは、
JSイベントハンドラー関数では、C ++オブジェクトをJavascriptコンテキストにフェッチし、それをメンバー関数と呼ぶ必要があります。このため、C ++フェッチ関数で、対応するJSピアオブジェクトが作成されているかどうかを確認します。そうでない場合は、JS_NewObjectを使用して作成し、返します。次に、JS関数はその上でネイティブ関数を呼び出すことができます。
問題は、場合によっては、そのようなネイティブ関数呼び出しの結果がC++オブジェクトの停止につながることです。ただし、JSコンテキストにJSピアオブジェクトを削除するように通知する方法も見つかりません。そのためのJSAPI関数が見つかりませんでした。
私の現在のプログラムでは、JS_NewObjectを使用して作成されたすべてのJSオブジェクトは、最終的にJSランタイムが破棄されるときに破棄されます。
これはSipderMonkeyの「ガベージコレクション」と関係があると思います。しかし、私はまだ良いガイドを見つけていません。提案をありがとう