我有一个关于C ++ Object& amp;的问题Javascript对象生命周期错误同步,希望你的大师可以帮助我。
具体来说,我在我的C ++程序中嵌入了SpiderMonkey。我不确定我的方法是否正确。我在做什么就像
(1)C ++程序加载Javascript文件并调用入口函数。
(2)在entry函数中,调用一些C ++函数来初始化程序。在这些调用期间,将创建一些C ++对象。
(3)基于用户交互,相应的脚本函数将被称为事件处理程序。
这种方法有效,但有一个问题(可能还有更多的问题:)
即,
在我的JS事件处理函数中,我需要将一个C ++对象提取到Javascript上下文并将其称为成员函数。为此,在我的C ++提取函数中,我检查是否已经创建了相应的JS对等对象。如果没有,我使用JS_NewObject创建一个并返回它。然后JS函数可以在其上调用本机函数。
问题是在某些情况下,这种本机函数调用的结果将导致C ++对象的死亡。但是,我找不到通知JS上下文删除其JS对等对象的方法。我没有找到JSAPI函数。
在我当前的程序中,使用JS_NewObject创建的所有JS对象在最终销毁JS运行时时都会被销毁。
我想这与SipderMonkey的“垃圾收集”有关。但我还没有找到一个好的指南。非常感谢任何建议
答案 0 :(得分:0)
JS是一个GC环境,因此您不能简单地“删除”GC分配的对象。您可以选择基本上有两个选项:
使您的C ++对象依赖于JS包装器对象,如果您使用引用计数,则在创建包装器时会增加C ++对象的ref,并在包装器对象终结器中减少ref。
当您销毁C ++对象时,获取包装器对象(如果存在),以清除对C ++对象的引用。现在所有的回调都需要在使用C ++对象之前进行空检查,但是你不会崩溃(你可能会在响应中抛出JS异常吗?)
在大多数情况下,选项1是用户期望的。
我指向所需的API,但我不知道SM API(我知道JSC API,但它们适用相同的概念)