2011-08-10 4 views
3

이 세그먼트 오류가 발생 V8의 sample.cc 샘플 쉘에 따라, 다음과 같은 코드 조각을 고려하십시오 : 나는 V8 후 V8 :: 배열을 인스턴스화하는 경우, 그러나왜 v8 :: String 이전에 새 v8 :: Array를 만들면 v8 :: String 및 v8 :: FunctionTemplate이 발생하지 않습니까?

int RunMain(int argc, char* argv[]) { 

    v8::V8::SetFlagsFromCommandLine(&argc, argv, true); 
    v8::HandleScope handle_scope; 
    // Create a template for the global object. 
    v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New(); 

    v8::Handle<v8::String> testStr = v8::String::New("test"); 

    v8::Handle<v8::Array> testArr = v8::Array::New(); 

    // Create a new execution environment containing the built-in 
    // functions 
    v8::Handle<v8::Context> context = v8::Context::New(NULL, global); 
    // Enter the newly created execution environment. 
    v8::Context::Scope context_scope(context); 

    return 0; 
} 

int main(int argc, char* argv[]) { 
    int result = RunMain(argc, argv); 
    v8::V8::Dispose(); 
    return result; 
} 

을 :: 문맥을 인스턴스화하고 범위는 다음 코드가 세그 폴트하지 않는 설정 :

int RunMain(int argc, char* argv[]) { 

    v8::V8::SetFlagsFromCommandLine(&argc, argv, true); 
    v8::HandleScope handle_scope; 
    // Create a template for the global object. 
    v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New(); 

    v8::Handle<v8::String> testStr = v8::String::New("test"); 


    // Create a new execution environment containing the built-in 
    // functions 
    v8::Handle<v8::Context> context = v8::Context::New(NULL, global); 
    // Enter the newly created execution environment. 
    v8::Context::Scope context_scope(context); 

    v8::Handle<v8::Array> testArr = v8::Array::New(); 

    return 0; 
} 

int main(int argc, char* argv[]) { 
    int result = RunMain(argc, argv); 
    v8::V8::Dispose(); 
    return result; 
} 

내 질문은 왜 첫 번째 예에서 V8 :: 배열의 원인이 세그 폴트 응용 프로그램을 인스턴스화 않습니다, V8 엔진을 만드는 :: 배열을 한 후에 반면, v8 :: 컨텍스트가 생성 되어도 응용 프로그램이 segfault를 발생시키지 않습니까? 그리고 컨텍스트가 생성되기 전에 v8 :: String을 인스턴스화하는 것이 응용 프로그램을 segfault로 만들지 않는 이유는 무엇입니까?

이 질문은 실제 쉘 응용 프로그램에서 배열을 인스턴스화하고 전역 컨텍스트 개체에 할당하려고하기 때문에 관련이 있습니다. 그러나 v8보다 먼저 컨텍스트를 만들어야하기 때문에 불가능합니다. : 배열을 인스턴스화하여 순환 종속성을 생성합니다.

누구든지 제공 할 수있는 지침을 알려 주시면 감사하겠습니다.

답변

5

API V8을 사용하여 v8::Array을 새로 만들면 실제로 현재 컨텍스트에서 Array 생성자가 호출됩니다. 자바 스크립트에서 new Array(n)을 (를) 실행 한 것과 같습니다. 컨텍스트가 없으면 V8이 호출하여 segfaults라는 배열을 생성 할 수 없습니다.

v8::String은 프리미티브 문자열 값을 나타냅니다. 컨텍스트 생성자를 생성하기 위해 호출해야합니다. 따라서 V8을 segfault하지 않고 컨텍스트 이전에 만들 수 있습니다.

Context::Global() 메서드에서 반환 한 개체의 필드를 직접 설정하여 컨텍스트의 전역 개체를 확장 할 수 있습니다.

관련 문제