如何存储对函数的引用,以便稍后在node.js C ++插件模块中调用它?

这里是我用C ++编写的node.js插件模块,使用node-gyp构build。 当StoreFunction我试图存储一个指向函数的指针,所以我可以稍后使用它

当我尝试稍后通过InvokeFunction调用它时,出现Segmentation错误。 如果我在两个函数(使用cout)中检查指针,我感到困惑,它们是相同的值。

所以我猜测调用两个函数之间调用上下文更改的变化,或者我不明白我指的是什么。

所有(ummmmmm)指针感激地收到我的问题在这里…………..

#include <node.h> #include <v8.h> using namespace v8; v8::Persistent<v8::Function> callbackFunction; Handle<Value> StoreFunction(const Arguments& args) { HandleScope scope; callbackFunction = *Local<Function>::Cast(args[0]); return scope.Close(Undefined()); } Handle<Value> InvokeFunction(const Arguments& args) { HandleScope scope; Local<Value> argv[1] = { String::New("Callback from InvokeFunction")}; callbackFunction->Call(Context::GetCurrent()->Global(), 1, argv); return scope.Close(Undefined()); } void init(Handle<Object> target) { NODE_SET_METHOD(target, "StoreFunction", StoreFunction); NODE_SET_METHOD(target, "InvokeFunction", InvokeFunction); } NODE_MODULE(someaddonmodule, init); 

当然有人打电话给js ………..

 var myaddon = require('../build/Release/someaddonmodule'); myaddon.StoreFunction(function(data){ console.log("Called back: "+data); }); myaddon.InvokeFunction(); //causes a segmentation fault 

答案是因为我们不再使用Java编程Toto。 我创build的指针指向本地句柄,而不是函数。 持有一个“引用”这个是不足以阻止V8垃圾收集当范围closures时将其销毁。

为了处理这个问题,需要向V8提出一个明确的请求来搁置一些内存来保存这样做的function:

 Persistent< Function > percy; Local<Function> callbackFunction = Local<Function>::Cast(args[0]); percy = Persistent<Function>::New(callbackFunction); 

如果有人对V8内部有更深入的了解,我还是很乐意听到你的解释:)