2010-09-02 84 views
0

我关于C++对象& JavaScript对象的生命周期误同步,在这里希望你大师可以帮助我的问题。C++对象和JavaScript对象的生命周期误同步

具体来说,我在我的C++程序中嵌入了SpiderMonkey。我不确定我的方法是否正确。我在做什么就像

(1)C++程序加载一个Javascript文件并调用一个入口函数。

(2)在入口函数中,调用一些C++函数来初始化程序。在这些调用中,将创建一些C++对象。 (3)基于用户交互,相应的脚本函数将被称为事件处理函数。

这种方法的工作原理,但有一个问题(可能有不明身份的更多:)

也就是说,

在我的JS事件处理函数,我需要获取一个C++对象给Javascript背景和称它为成员函数。为此,在我的C++读取函数中,我检查是否已创建其相应的JS对象。如果不是,我使用JS_NewObject创建一个并返回它。然后JS函数可以调用它的本地函数。

的问题是,在某些情况下,这种本地函数调用的结果会导致C++对象的死亡。但是,我找不到一种方法来通知JS上下文来删除它的JS对象。我没有找到一个JSAPI函数来这样做。

在我目前的计划,当最后的JS运行时被销毁所有使用JS_NewObject建立的JS对象被销毁。

我想这与SipderMonkey的“垃圾收集”有关。但我还没有找到一个好的指导。非常感谢任何suggestionto

回答

0

JS是GC'd环境,所以你不能简单地“删除”选区分配的对象。基本上有2个选项,你可以采取:

  1. 让你的C++对象是依赖于JS包装对象上,如果您使用引用计数例如,当你创建一个包装,你会增加C++对象的裁判,和递减包装器对象终结器中的引用。

  2. 当破坏C++对象,取包装对象(如果它存在),为澄清的参照C++的对象。你所有的回调,现在需要将之前使用C++对象空检查,但你不会崩溃(你可以在响应抛出一个JS例外吧?)

在大多数情况下,选项1是用户期望。

我会指向所需的API,但我不知道SM API(我知道JSC API代替,但它们适用相同的概念)