2014-03-06 2 views
1

V8 임베딩을 처음 사용하여 현재 사용중인 스크립팅 언어를 V8 라이브러리로 대체하기 시작했습니다. 그러나 나는 정말로 이상한 (적어도 나를 위해) 문제에 빠지게된다. 그것은 마치 내가하고있는 일을하는 유일한 사람인 것처럼 느껴지고 나는 바보 같은 짓을하고있는 것처럼 느낍니다.V8 C++ 임베딩 문제

내가 V8 엔진 기능을 포장하고 내 래퍼가 구축 될 때 엔진을 구성하는 래퍼 클래스를 만든

은 (엿 같은 변수 이름이나 바보 스타일을 무시하십시오) :

engine.h :

namespace JSEngine { 

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

engine.cpp :

JSEngine::Engine::Engine() 
{ 
    v8::Locker locker(); 
    V8::Initialize(); 

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

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

그 코드는 내가 이것을 시도하지만, 일단 벌금과 멋쟁이 :

,
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);

내가 뭘 잘못 아무 생각이 없다거나이 방법도 좋습니다 경우. SEGMENTATION FAULT 오류를 해결하는 데 도움 주시겠습니까?

답변

1

컨텍스트 멤버 변수는 로컬 범위에서 생성되며 범위가 삭제되어 엔진 생성자가 완료되면 바로 사용할 수없는 로컬 핸들입니다. 컨텍스트에 대한 지속적인 핸들이 필요합니다.

v8::Persistent<v8::Context> context; 

를 사용하도록 엔진 선언을 변경하고 당신이 실제로 컨텍스트를 만들 때,

this->context.Reset(this->isolate, Context::New(this->isolate)); 

하고 소멸자에서 사용하는 사용

this->context.Reset(); 
관련 문제