首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么在v8::Scope之前创建新的v8::Array会导致分段错误,而v8::String和v8::FunctionTemplate不会?

为什么在v8::Scope之前创建新的v8::Array会导致分段错误,而v8::String和v8::FunctionTemplate不会?
EN

Stack Overflow用户
提问于 2011-08-11 01:22:36
回答 1查看 1.7K关注 0票数 3

请考虑以下基于V8的sample.cc示例外壳的代码片段,这些代码片段会导致分段错误:

代码语言:javascript
复制
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::数组,则代码不会:

代码语言:javascript
复制
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::数组之前创建上下文,从而创建循环依赖。

如果任何人能提供指导,我将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-11 02:23:29

当您通过API创建新的v8::Array时,V8实际上是从当前上下文调用Array构造函数。这几乎就像是在JavaScript中执行new Array(n)一样。如果没有上下文,那么V8就没有什么可以调用来创建数组,这就是它分段错误的原因。

v8::String表示原始字符串值。不需要调用特定于上下文的构造函数来创建它。这就是为什么你可以在上下文之前创建它,而不需要分割V8。

您可以在创建context的全局对象后,通过直接在Context::Global()方法返回的对象上设置字段来对其进行扩展。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7015068

复制
相关文章

相似问题

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