v8::Persistent 不会持续超出包含 v8::HandleScope 的块
v8::Persistent not persisting beyond a block containing a v8::HandleScope
我有这个简短的程序来测试 v8 中的持久句柄。如果我理解正确,即使在创建该对象的句柄范围被销毁后,持久句柄也应该使它的引用对象保持活动状态,但此测试并未表明是这种情况。
我目前在 Ubuntu 18.04,x86_64。我从操作系统的 "libv8-dev" 包中安装了 v8。软件包的版本是“3.14.5.8-11ubuntu1”,来源是 "libv8-3.14".
在这个测试中,我有一个在块外声明的持久句柄。然后,在该块内,我从使用值 9.8 创建的数字的本地句柄分配给持久句柄。本地句柄是在包含句柄作用域的块中创建的。块结束后,我通过在循环中发送空闲通知来强制垃圾收集器完成它的工作,一旦垃圾收集器清理完它可以清理的所有内容,该循环就会结束。作为测试的一部分,我这样做是为了查看持久句柄是否真的保留了数字,但事实并非如此。在程序接近尾声时,打印持久句柄所持有的值导致值“0”而不是预期值“9.8”。
#include "v8.h"
#include <iostream>
int main()
{
v8::HandleScope outer_handle_scope;
v8::Persistent<v8::Context> context(v8::Context::New());
v8::Context::Scope context_scope(context);
v8::Persistent<v8::Number> persistent_handle;
{
v8::HandleScope inner_handle_scope;
persistent_handle = v8::Persistent<v8::Number>(v8::Number::New(9.8));
}
while (!v8::V8::IdleNotification()) {}
/* Should print 9.8 but it prints 0 */
std::cout << persistent_handle->Value() << std::endl;
persistent_handle.Dispose();
return 0;
}
我认为该程序应该打印“9.8”,但它打印的是“0”,因此持久句柄似乎无法使其对象在其初始范围之外保持活动状态。
编辑 1:经过额外的测试,程序似乎总是为 9.8 或 -3.4 等小数值输出“0”。然而,对于像 10 和 -20 这样的整数,该程序将运行并输出相同的值。问题就更玄乎了
来自 v8.h 3.14 版中嵌入的文档:
/**
* "Casts" a plain handle which is known to be a persistent handle
* to a persistent handle.
*/
template <class S> explicit inline Persistent(Handle<S> that)
: Handle<T>(*that) { }
你想要的是 Persistent::New
,它实际上创建了一个新的 Persistent
。
也就是说,V8 版本 3.14 来自 2013 年。可能很奇怪,and/or当前文档可能不再适用于它。针对如此旧的 API 开发新应用程序会在升级后造成一些移植工作,因此我建议立即从最新版本开始。试试 7.3,当前的稳定版本。
我有这个简短的程序来测试 v8 中的持久句柄。如果我理解正确,即使在创建该对象的句柄范围被销毁后,持久句柄也应该使它的引用对象保持活动状态,但此测试并未表明是这种情况。
我目前在 Ubuntu 18.04,x86_64。我从操作系统的 "libv8-dev" 包中安装了 v8。软件包的版本是“3.14.5.8-11ubuntu1”,来源是 "libv8-3.14".
在这个测试中,我有一个在块外声明的持久句柄。然后,在该块内,我从使用值 9.8 创建的数字的本地句柄分配给持久句柄。本地句柄是在包含句柄作用域的块中创建的。块结束后,我通过在循环中发送空闲通知来强制垃圾收集器完成它的工作,一旦垃圾收集器清理完它可以清理的所有内容,该循环就会结束。作为测试的一部分,我这样做是为了查看持久句柄是否真的保留了数字,但事实并非如此。在程序接近尾声时,打印持久句柄所持有的值导致值“0”而不是预期值“9.8”。
#include "v8.h"
#include <iostream>
int main()
{
v8::HandleScope outer_handle_scope;
v8::Persistent<v8::Context> context(v8::Context::New());
v8::Context::Scope context_scope(context);
v8::Persistent<v8::Number> persistent_handle;
{
v8::HandleScope inner_handle_scope;
persistent_handle = v8::Persistent<v8::Number>(v8::Number::New(9.8));
}
while (!v8::V8::IdleNotification()) {}
/* Should print 9.8 but it prints 0 */
std::cout << persistent_handle->Value() << std::endl;
persistent_handle.Dispose();
return 0;
}
我认为该程序应该打印“9.8”,但它打印的是“0”,因此持久句柄似乎无法使其对象在其初始范围之外保持活动状态。
编辑 1:经过额外的测试,程序似乎总是为 9.8 或 -3.4 等小数值输出“0”。然而,对于像 10 和 -20 这样的整数,该程序将运行并输出相同的值。问题就更玄乎了
来自 v8.h 3.14 版中嵌入的文档:
/**
* "Casts" a plain handle which is known to be a persistent handle
* to a persistent handle.
*/
template <class S> explicit inline Persistent(Handle<S> that)
: Handle<T>(*that) { }
你想要的是 Persistent::New
,它实际上创建了一个新的 Persistent
。
也就是说,V8 版本 3.14 来自 2013 年。可能很奇怪,and/or当前文档可能不再适用于它。针对如此旧的 API 开发新应用程序会在升级后造成一些移植工作,因此我建议立即从最新版本开始。试试 7.3,当前的稳定版本。