首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >V8 C++嵌入问题

V8 C++嵌入问题
EN

Stack Overflow用户
提问于 2014-03-07 06:43:35
回答 1查看 1.4K关注 0票数 1

我是V8嵌入的新手,刚刚开始用V8库替换我当前的脚本语言。然而,我遇到了一些非常奇怪的问题(至少对我来说是这样)。感觉就像我是唯一一个在做我正在做的事情的人,而且我觉得我在做一些愚蠢的事情。

我已经创建了一个包装器类来包装V8引擎函数,并在构造包装器时构造引擎(尝试忽略糟糕的变量名或愚蠢的样式):

engine.h:

代码语言:javascript
复制
namespace JSEngine {

class Engine
{
    public:
        Engine();
        virtual ~Engine();
        v8::Isolate* isolate;
        v8::Handle<v8::Context> context;
};
}

engine.cpp (包括engine.h):

代码语言:javascript
复制
JSEngine::Engine::Engine()
{   
    v8::Locker locker();
    V8::Initialize();

    this->isolate = Isolate::GetCurrent();
    HandleScope scope(this->isolate);

    this->context = Context::New(this->isolate);
}

这段代码很好,但是一旦我尝试了一下:

代码语言:javascript
复制
Server::jsEngine = new JSEngine::Engine();
HandleScope scope(Server::jsEngine->isolate);
Context::Scope context_scope(Server::jsEngine->context);

Handle<String> source = String::NewFromUtf8(Server::jsEngine->isolate, "'Hello' + ', World!'");
Handle<Script> script = Script::Compile(source);
Handle<Value> result = script->Run();

String::Utf8Value utf8(result);
printf("%s\n", *utf8);

我在这一行得到了分段错误:Context::Scope context_scope(Server::jsEngine->context);

我不知道我做错了什么,也不知道这种方法是否是最佳实践。你能帮我解决分段错误吗?

EN

回答 1

Stack Overflow用户

发布于 2014-03-28 04:33:00

您的上下文成员变量是在本地作用域中创建的本地句柄,一旦引擎构造函数完成,该变量就会无效,因为作用域已被删除。你需要一个持久化句柄来处理你的上下文。将引擎声明更改为使用

代码语言:javascript
复制
v8::Persistent<v8::Context> context;

当您实际创建上下文时,使用

代码语言:javascript
复制
this->context.Reset(this->isolate, Context::New(this->isolate));

在你的析构函数中,使用

代码语言:javascript
复制
this->context.Reset();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22237784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档