0

我有一个关于 C++ 对象和 Javascript 对象生命周期错误同步的问题,希望您的专家可以帮助我。

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

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

(2)在入口函数中,调用一些C++函数来初始化程序。在这些调用期间,将创建一些 C++ 对象。

(3) 基于用户交互,调用相应的脚本函数作为事件处理函数。

这种方法有效,但有一个问题(可能还有更多:)

那是,

在我的 JS 事件处理函数中,我需要获取一个 C++ 对象到 Javascript 上下文并调用它的成员函数。为此,在我的 C++ 获取函数中,我检查其对应的 JS 对等对象是否已创建。如果没有,我使用 JS_NewObject 创建一个并返回它。然后 JS 函数可以调用它的原生函数。

问题在于,在某些情况下,这种原生函数调用的结果会导致 C++ 对象的死亡。但是,我也找不到通知 JS 上下文删除其 JS 对等对象的方法。我找不到这样做的 JSAPI 函数。

在我当前的程序中,当最终销毁 JS 运行时,所有使用 JS_NewObject 创建的 JS 对象都将被销毁。

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

4

1 回答 1

0

JS 是一个 GC 环境,所以你不能简单地“删除”一个 GC 分配的对象。基本上有两种选择:

  1. 使您的 C++ 对象依赖于 JS 包装器对象,例如,如果您使用引用计数,您将在创建包装器时增加 C++ 对象的引用,并减少包装器对象终结器中的引用。

  2. 当您销毁 C++ 对象时,获取包装器对象(如果存在)以清除对 C++ 对象的引用。现在,您的所有回调都需要在使用 C++ 对象之前进行空检查,但您不会崩溃(您可能会抛出 JS 异常作为响应?)

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

我会指出所需的 API,但我不知道 SM API(我知道 JSC API,但它们的概念相同)

于 2010-09-02T10:22:48.073 回答