2014-02-09 26 views
4

這裏是一個node.js插件模塊,我用C++編寫並使用node-gyp構建。 當StoreFunction我想存儲的指針功能,這樣我就可以使用它以後如何存儲對函數的引用,以便稍後在node.js C++插件模塊中調用它?

當我稍後再嘗試調用它雖然InvokeFunction我得到一個分割故障。如果我在兩個函數中檢查指針(使用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 

回答

3

答案是因爲我們不再用Java編程Toto。 我創建的指針指向Local Handle,而不是函數。持有這個引用並不足以在範圍關閉時停止V8垃圾回收。需要

爲了解決這個問題的明確要求進行到V8拋開一些內存來保存 其這樣做的功能:

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

如果有人有更好的理解V8內部的瞭解更多比這個,我還是很想聽聽你的解釋:)

相關問題