请考虑以下基于V8的sample.cc示例外壳的代码片段,这些代码片段会导致分段错误:
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;
}但是,如果我在实例化了v8::Context并设置了作用域之后实例化了V8::数组,则代码不会:
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::数组不会导致应用程序分段错误?而且,为什么在创建上下文之前实例化v8::String也不会导致应用程序分段错误?
这个问题是相关的,因为在真实的shell应用程序中,我希望实例化一个数组并将其分配给全局上下文对象,但这是不可能的,因为似乎必须在实例化V8::数组之前创建上下文,从而创建循环依赖。
如果任何人能提供指导,我将不胜感激。
发布于 2011-08-11 02:23:29
当您通过API创建新的v8::Array时,V8实际上是从当前上下文调用Array构造函数。这几乎就像是在JavaScript中执行new Array(n)一样。如果没有上下文,那么V8就没有什么可以调用来创建数组,这就是它分段错误的原因。
v8::String表示原始字符串值。不需要调用特定于上下文的构造函数来创建它。这就是为什么你可以在上下文之前创建它,而不需要分割V8。
您可以在创建context的全局对象后,通过直接在Context::Global()方法返回的对象上设置字段来对其进行扩展。
https://stackoverflow.com/questions/7015068
复制相似问题