首页 / JAVASCRIPT / javascript – 为什么在v8 :: Scope之前创建新的v8 :: Array会导致分段错误,但是v8 :: String和v8 :: FunctionTemplate不会?
javascript – 为什么在v8 :: Scope之前创建新的v8 :: Array会导致分段错误,但是v8 :: String和v8 :: FunctionTemplate不会?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 为什么在v8 :: Scope之前创建新的v8 :: Array会导致分段错误,但是v8 :: String和v8 :: FunctionTemplate不会?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2331字,纯文字阅读大概需要4分钟。
内容图文
![javascript – 为什么在v8 :: Scope之前创建新的v8 :: Array会导致分段错误,但是v8 :: String和v8 :: FunctionTemplate不会?](/upload/InfoBanner/zyjiaocheng/720/e33e937e1cb845eca75e2c218ffcfc70.jpg)
请考虑以下代码片段,基于v8的sample.cc示例shell,这会导致分段错误:
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 :: Array,则代码不会出现段错误:
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 :: Array会导致应用程序出现段错误,而在创建v8 :: Context之后创建v8 :: Array会导致应用程序出现段错误?而且,为什么在创建Context之前实例化v8 :: String也不会导致应用程序出现段错误?
这个问题是相关的,因为在一个真正的shell应用程序中,我想实例化一个数组并将它分配给全局上下文对象,但这是不可能的,因为它似乎必须在v8 :: Array之前创建上下文实例化,从而创建循环依赖.
我很感激任何人都可以提供任何指导.
解决方法:
当您通过API V8创建新的v8 :: Array时,实际上从当前上下文调用Array构造函数.这几乎就像你在JavaScript中执行了新的Array(n).如果没有上下文,那么V8就无法调用来创建一个数组,这就是为什么它会出现段错误.
v8 :: String表示原始字符串值.不必调用特定于上下文的构造函数来创建它.这就是为什么你可以在没有segfaulting V8的上下文之前创建它的原因.
您可以通过直接设置Context :: Global()方法返回的对象上的字段来扩展上下文的全局对象.
内容总结
以上是互联网集市为您收集整理的javascript – 为什么在v8 :: Scope之前创建新的v8 :: Array会导致分段错误,但是v8 :: String和v8 :: FunctionTemplate不会?全部内容,希望文章能够帮你解决javascript – 为什么在v8 :: Scope之前创建新的v8 :: Array会导致分段错误,但是v8 :: String和v8 :: FunctionTemplate不会?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。