動的ライブラリは、いくつかのCファイルを使用して作成されます。この動的ライブラリは、C++関数によって使用されます。 C関数の1つは、C++関数を呼び出します。これはJavascript関数コールバックを呼び出します。私はC + +の関数でセグメンテーションフォールトを取得しています。ここ 永続関数を使用したjavascriptのセグメント化エラー
はTEST.CPPのコードコード、TEST.Hにおいて 、ここ
#ifdef __cplusplus
extern "C" {
#endif
void cppFunc(void);
#ifdef __cplusplus
}
#endif
がTEST.Cここ
#include "test.h"
void cFunc(void){
/* some code */
cppFunc();
}
のコードである
#include "test.h"
static Nan::Persistent<v8::Function> callback;
void storeFunc(const v8::FunctionCallbackInfo<v8::Value>& args){
if(args[0]->IsFunction()){
Local<Function> cb = Local<Function>::Cast(args[0]);
callback.Reset(cb);
}
}
void cppFunc(void){
Isolate *isolate = Isolate::GetCurrent();
Local<Function> c_back = Local<Function>::New(isolate, callback);
Nan::MakeCallback(Nan::GetCurrentContext()->Global(), c_back, 0, {});
}
void init(Handle<Object> exports, Handle<Object> module)
{
NODE_SET_METHOD(exports, "FuncStore", storeFunc);
}
NODE_MODULE(test, init)
test.nodeは、「node-gyp configure build」コマンドを使用して作成されます。エラーや警告は表示されません。 "ノードtest.js" でtest.jsを実行するには、
var sample = require("./build/Release/test.node");
sample.FuncStore(function(){
console.log("Callback has been called!!");
});
私test.jsファイルであるときcFunc()、セグメンテーションフォールトが発生した後
は)(cppFuncを呼び出します。セグメンテーションフォルトは、 "Local c_back = Local :: New(分離、コールバック);"という行で正確に起こっています。 cppFunc()内にあります。
何故その理由が考えられますか?
を廃止されているようだとNULLが割り当てられている「隔離」のように思えるときcppFuncの呼びかけ()はcFunc()から来ています。 CPP関数が作成され、C関数を呼び出し、その関数がcppFunc()を呼び出すと、NULL値が割り付けられません。この動作は私にとっては少し混乱します。 例:test.cファイル内 void testFunc() { cppFunc(); } 内のtest.cpp void newFunc() { testFunc(); } 元の質問と同様にjavascriptからnewFunc()を呼び出します。 – alchemist
それから、私たちはあなたが求めていた問題の原因を見つけました。隔離ポインタが適切に初期化されていません。 – diametralpitch
これを適切に初期化する方法はありますか? – alchemist