我在我的C++应用程序中嵌入了Spidermonkey。我需要在本地C++中实现一些自定义Javascript函数,这些函数传递给jsval。我需要防止jsval意外收集垃圾。它是正确的,我做到这一点:Spidermonkey和垃圾回收
(1)在一个init程序:
static jsval vp; // a STATIC variable, value unknown
JSBool init((JSContext *cx, uintN argc, jsval *vp) {
JS_AddValueRoot(cx, &vp);
}
(2)在一个C++函数执行Javascript函数的setter():
JSBool setter(JSContext *cx, uintN argc, jsval *vp) {
...
vp=...;// set to some JSObject and hopefully makes any previous JSObject available for gc
}
(3)在执行Javascript函数getter()的同一编译单元内的第二个C++函数调用中:
JSBool getter(JSContext *cx, uintN argc, jsval *vp) {
jsval somethingelse = vp; //directly retrieve the static value stored by setter()
....
}
我的javascript脚本使用的函数调用是这样的:
init();
setter(...);
some_other_function_call_that_causes_gc();
getter();
setter(...);
some_other_function_call_that_causes_gc();
getter();
....
some_other_function_call_that_causes_gc();
setter(...);
some_other_function_call_that_causes_gc();
getter();
注意,我从来没有叫JS_RemoveRoot(),因为静态jsval VP是我jsval 2个函数调用之间传递的永久存储。并且,假设以前存储在jsval中的任何JSObject都可用于垃圾收集,我会在setter()中将新值设置到gc扎根静态变量vp中。
这些正确的方法来创建gc可以通过函数调用传递的临时变量?特别是,我的setter()方法替代了以前的JSObject,使得现有的JSObject可用于gc(即没有内存泄漏/崩溃)。
编辑:为什么我相信垃圾收集是一个问题的原因是:
https://developer.mozilla.org/En/SpiderMonkey/JSAPI_User_Guide
根据第JSAPI概念,使用Javascript价值观:
一个JSVal本身并不能保护它来自垃圾的物品 收藏家
https://developer.mozilla.org/en/SpiderMonkey_Garbage_Collection_Tips
示例3说“当你去”并显示如何将jsval分配给根。
我没有看到为什么变量会在垃圾回收的风险?你能否指出这一点。 – Jivings 2012-03-07 10:45:21
因为在我的Javascript脚本中,我正在调用setter()和getter之间的其他Javascript函数。请注意,setter()设置它的值,然后,另一个函数getter()获取该值。 – JavaMan 2012-03-07 10:48:14
有多少功能并不重要。如果没有对它的引用,东西只会是GC。也许我不了解这个问题。你有证据表明GC正在删除你需要的变量吗? – Jivings 2012-03-07 11:04:49