在AfterWork中调用Persistent <Function> callback segfaults

下面的代码可以在OS X中使用,但是当我在Ubuntu中编译并运行它时,在调用baton->callback函数时会出现段错误。 看起来Persistent<Function>不会持续超过最初的Aysnc::Start方法。

如果是这种情况, 为什么它在OS X上工作我能做些什么来使其跨平台工作

如果我做错了 ,我需要做些什么才能使我的callbackAfterWork调用?

 // Async.h #include <v8.h> #include <node.h> #include <string> using namespace node; using namespace v8; class Async : public ObjectWrap { public: static Persistent<Function> constructor_template; static void Initialize(Handle<v8::Object> target); protected: Async() {} ~Async() {} static Handle<Value> Start(const Arguments& args); static void Work(uv_work_t* req); static void AfterWork(uv_work_t* req); private: struct Baton { uv_work_t request; Persistent<Function> callback; }; }; // Async.cc Handle<Value> Async::Start(const Arguments& args) { HandleScope scope; if(args.Length() == 0 || !args[0]->IsFunction()) { return ThrowException(Exception::Error(String::New("Callback is required and must be a Function."))); } Baton *baton = new Baton(); baton->request.data = baton; baton->callback = Persistent<Function>::New(Handle<Function>::Cast(args[0])); uv_queue_work(uv_default_loop(), &baton->request, Work, (uv_after_work_cb)AfterWork); return Undefined(); } void Async::Work(uv_work_t *req) { printf("Work\n"); } void Async::AfterWork(uv_work_t *req) { printf("AfterWork\n"); HandleScope scope; Baton *baton = static_cast<Baton *>(req->data); delete req; Local<Value> argv[1] = { Local<Value>::New(Null()); }; TryCatch try_catch; // Segfault occurs here baton->callback->Call(Context::GetCurrent()->Global(), 1, argv); if (try_catch.HasCaught()) { node::FatalException(try_catch); } } 

我不熟悉libuv ,但是给定了Baton的定义,并假设传入AfterWork()uv_work_t*传入AfterWork()相同,你的delete req语句实际上删除了你的Baton结构。然后尝试读取callback字段。 我会尝试删除delete req ,并在AfterWork()最后添加delete baton