C++ google v8持久上下文-脚本编译崩溃

C++ google v8持久上下文-脚本编译崩溃,c++,compilation,v8,embedded-v8,C++,Compilation,V8,Embedded V8,我试图为以后的执行使用一个全局上下文。调用function1时,脚本返回正确的值。然而,当我在此之后调用function2时,Script::Compile崩溃了。函数1是v8的初始化,所以我只调用它一次 全局变量: Isolate *isolate; Persistent<Context> pContext; 隔离*隔离; 持久pContext; 功能1的代码: auto platform = platform::NewDefaultPlatform()

我试图为以后的执行使用一个全局上下文。调用function1时,脚本返回正确的值。然而,当我在此之后调用function2时,Script::Compile崩溃了。函数1是v8的初始化,所以我只调用它一次

全局变量:

    Isolate *isolate;
    Persistent<Context> pContext;
隔离*隔离;
持久pContext;
功能1的代码:

    auto platform = platform::NewDefaultPlatform();
    V8::InitializePlatform(platform.get());
    V8::Initialize();

    Isolate::CreateParams create_params;
    create_params.array_buffer_allocator = ArrayBuffer::Allocator::NewDefaultAllocator();
    isolate = Isolate::New(create_params);

    Locker locker(isolate);

    Isolate::Scope isolate_scope(isolate);
    HandleScope handle_scope(isolate);

    Local<Context> context = Context::New(isolate);
    pContext.Reset(isolate, context);

    Context::Scope context_scope(context);

    Local<Script> script = Script::Compile(context, to_v8(isolate, "'Test'")).ToLocalChecked();

    Local<Value> r = script->Run(context).ToLocalChecked();

    cout << "script result: " << *(String::Utf8Value(isolate, r));
auto-platform=platform::NewDefaultPlatform();
V8::InitializePlatform(platform.get());
V8::Initialize();
隔离::CreateParams创建_参数;
创建_params.array_buffer_allocator=ArrayBuffer::allocator::NewDefaultAllocator();
隔离=隔离::新建(创建参数);
储物柜(隔离);
隔离::范围隔离\范围(隔离);
手柄镜手柄范围(隔离);
本地上下文=上下文::新建(隔离);
重置(隔离、上下文);
上下文::范围上下文\范围(上下文);
Local script=script::Compile(上下文,to_v8(隔离,“'Test'))。ToLocalChecked();
本地r=脚本->运行(上下文).ToLocalChecked();

cout看起来这是与以下问题相同的:
v8::platform::NewDefaultPlatform
返回一个
std::unique\u ptr
(由于使用了
auto
,所以它在超出范围时会被销毁。让它成为一个全局变量,事情就会发生

注1:如果您编译了一个调试版本并使用了调试器,您将能够自己解决此类问题,这将比不得不在某个地方发布问题然后等待别人回答问题节省大量时间


注2:小心使用
自动
。类型是有意义的;正如这个问题所示,看到它们(通过拼写它们)有助于避免错误。

看起来这与:
v8::platform::NewDefaultPlatform
返回一个
std::unique\u ptr
(由于使用了
auto
),因此当它超出范围时会被销毁。让它成为一个全局变量,事情就会发生

注1:如果您编译了一个调试版本并使用了调试器,您将能够自己解决此类问题,这将比不得不在某个地方发布问题然后等待别人回答问题节省大量时间

注2:小心使用
自动
。类型是有意义的;正如这个问题所说明的,看到它们(通过把它们拼写出来)有助于避免bug

Isolate::Scope isolate_scope(isolate);
HandleScope handle_scope(isolate);

Local<Context> context = Local<Context>::New(isolate, pContext);

Local<Script> script = Script::Compile(context, to_v8(isolate, "'Test'")).ToLocalChecked();

Context::Scope context_scope(context);
Local<Value> r = script->Run(context).ToLocalChecked();

cout << "script result: " << *(String::Utf8Value(isolate, r));
at v8::internal::Compiler::GetSharedFunctionInfoForScript[v8::internal::Isolate*, v8::internal::Handle<v8::internal::String>, v8::internal::Compiler::ScriptDetails const&, v8::ScriptOriginOptions, v8::Extension*, v8::internal::ScriptData*, v8::ScriptCompiler::CompileOptions, v8::ScriptCompiler::NoCacheReason, v8::internal::NativesFlag] (UnknownFile:?)
at v8::ScriptCompiler::CompileUnboundInternal[v8::Isolate*, v8::ScriptCompiler::Source*, v8::ScriptCompiler::CompileOptions, v8::ScriptCompiler::NoCacheReason] (UnknownFile:?)
at v8::ScriptCompiler::Compile[v8::Local<v8::Context>, v8::ScriptCompiler::Source*, v8::ScriptCompiler::CompileOptions, v8::ScriptCompiler::NoCacheReason] (UnknownFile:?)
at v8::Script::Compile[v8::Local<v8::Context>, v8::Local<v8::String>, v8::ScriptOrigin*] (UnknownFile:?)