gpt4 book ai didi

node.js - 在 AfterWork 中调用 Persistent 回调段错误

转载 作者:太空宇宙 更新时间:2023-11-03 22:02:39 24 4
gpt4 key购买 nike

下面的代码可以在 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("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 的定义,并假设 uv_work_t* 传递到 AfterWork() 与传递给 uv_queue_work() 的相同,您的 delete req 语句实际上删除了您的 Baton 结构,然后您尝试从中读取callback字段。我会尝试删除 delete req 并在 AfterWork() 的最后添加 delete baton

关于node.js - 在 AfterWork 中调用 Persistent<Function> 回调段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15523582/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com