/ / AfterWorkでPersistent <Function>コールバックsegfaultsを呼び出す-node.js、v8

AfterWorkで永続的な<Function>コールバックセグメンテーションを呼び出す - node.js、v8

以下のコードはOS Xで機能しますが、Ubuntuでコンパイルして実行すると、 baton->callback 関数。のようです Persistent<Function> イニシャルを過ぎても持続しない Aysnc::Start 方法。

このような場合は、 OS Xで動作する理由クロスプラットフォームで機能させるにはどうすればよいですか

私がそれを間違っているなら、私を作るために何をする必要がありますか callback から呼び出し可能 AfterWork

// 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("Workn");
}

void Async::AfterWork(uv_work_t *req) {
printf("AfterWorkn");
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);
}
}

回答:

回答№1は2

私は慣れていない libuv、しかしあなたの定義を考えると Baton、そして uv_work_t* 渡された AfterWork() 渡されたものと同じです uv_queue_work()、 きみの delete req ステートメントは実際にあなたを削除します Baton 構造体、そこから読み取りを試みます callback フィールド。削除してみます delete req 追加する delete baton の最後に AfterWork().