0

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の「ガベージコレクション」と関係があると思います。しかし、私はまだ良いガイドを見つけていません。提案をありがとう

4

1 に答える 1

0

JSはGC環境であるため、GCで割り当てられたオブジェクトを単純に「削除」することはできません。あなたが取ることができる基本的に2つのオプションがあります:

  1. C ++オブジェクトをJSラッパーオブジェクトに依存させるようにします。たとえば、refcountingを使用している場合は、ラッパーを作成したときにC ++オブジェクトの参照をインクリメントし、ラッパーオブジェクトのファイナライザーで参照をデクリメントします。

  2. C ++オブジェクトを破棄するときは、ラッパーオブジェクト(存在する場合)をフェッチして、C++オブジェクトへの参照をクリアします。すべてのコールバックは、C ++オブジェクトを使用する前にnullチェックする必要がありますが、クラッシュすることはありません(おそらく、応答としてJS例外をスローする可能性がありますか?)

ほとんどの場合、オプション1はユーザーが期待するものです。

必要なAPIを指摘しますが、SM APIがわかりません(代わりにJSC APIを知っていますが、同じ概念が適用されます)

于 2010-09-02T10:22:48.073 に答える