Javascript 调用V8函数会导致访问冲突

Javascript 调用V8函数会导致访问冲突,javascript,c++,function,access-violation,v8,Javascript,C++,Function,Access Violation,V8,我有一个全局事件管理器,允许您使用lambdas收听string事件名称 // somewhere in the ModuleScript class Event->Listen("WindowResize", [=]{ // ... }); 现在,我也想从JavaScript注册到事件。因此,我写了这个回调 v8::Handle<v8::Value> ModuleScript::jsOn(const v8::Arguments& args) { //

我有一个全局事件管理器,允许您使用lambdas收听
string
事件名称

// somewhere in the ModuleScript class
Event->Listen("WindowResize", [=]{
    // ...
});
现在,我也想从JavaScript注册到事件。因此,我写了这个回调

v8::Handle<v8::Value> ModuleScript::jsOn(const v8::Arguments& args)
{
    // get pointer to class since we're in a static method
    ModuleScript *module = (ModuleScript*)HelperScript::Unwrap(args.Data());

    // get event name we want to register to from arguments
    if(args.Length() < 1 || !args[0]->IsString())
        return v8::Undefined();
    string name = *v8::String::Utf8Value(args[0]);

    // get callback function from arguments
    if(args.Length() < 2 || !args[1]->IsFunction())
        return v8::Undefined();
    v8::Handle<v8::Function> callback =
        v8::Local<v8::Function>::Cast(args[1]->ToObject());

    // register event on global event manager
    module->Event->Listen(name, [=]{
        // create persistent handle so that function stays valid
        // maybe this doesn't work, I don't know
        v8::Persistent<v8::Function> function =
            v8::Persistent<v8::Function>::New(args.GetIsolate(), callback);
        // execute callback function
        // causes the access violation
        function->Call(function, 0, NULL);
    });

    return v8::Undefined();
}
v8::handlemodulescript::jsOn(常量v8::参数和参数)
{
//获取指向类的指针,因为我们处于静态方法中
ModuleScript*模块=(ModuleScript*)HelperScript::展开(args.Data());
//从参数中获取要注册到的事件名称
if(args.Length()<1 | |!args[0]->IsString())
返回v8::Undefined();
string name=*v8::string::Utf8Value(args[0]);
//从参数获取回调函数
if(args.Length()<2 | |!args[1]->IsFunction())
返回v8::Undefined();
句柄回调=
v8::Local::Cast(args[1]->ToObject());
//在全局事件管理器上注册事件
模块->事件->侦听(名称,[=]{
//创建持久句柄,使函数保持有效
//也许这不管用,我不知道
持久函数=
v8::Persistent::New(args.GetIsolate(),回调);
//执行回调函数
//导致访问冲突
函数->调用(函数,0,空);
});
返回v8::Undefined();
}
触发事件时,应用程序会因访问冲突而崩溃。我的想法是,要么函数对象此时不再有效,要么它是一个JavaScript范围问题。但我想不出来


是什么导致访问冲突以及如何克服它?

我认为这里有几个潜在的问题

首先,在
ModuleScript::jsOn()
终止后,您没有使用持久句柄来保存JavaScript函数。在调用事件处理程序时,该函数可能已经消失。考虑制作<代码>回调< /代码>一个持久句柄.< /p> 其次,在调用JavaScript函数之前,事件处理程序需要输入适当的V8上下文。根据您的体系结构,可能还需要显式锁定并进入V8隔离

第三(在您的特定场景中,这可能不是问题),您需要管理V8隔离的生存期。如果事件管理器在后台线程上触发事件,则必须确保事件处理程序以某种方式防止从其他线程释放隔离。不幸的是,这是V8 API没有提供太多帮助的一个领域

第四,为了防止泄漏,事件处理程序应该在调用函数后处理持久函数句柄


祝你好运

什么指令导致访问冲突?@Gonmator错误位于
function->Call(function,0,NULL)行。我使用了
[=]
capture子句和
v8::HandleScope作用域(v8::Isolate::GetCurrent())
persistent->Call(persistent,0,NULL)在lambda中。对,我忘记了句柄范围。很高兴你成功了!