我有这个简短的程序来测试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这样的整数,程序将运行并输出相同的值。现在,问题变得更加神秘。
答案 0 :(得分:0)
摘自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年开始的。这可能很奇怪,并且/或者当前的文档可能不再适用于它。升级后,使用这样的旧API开发新的应用程序将需要一些移植工作,因此,我建议立即从最新版本开始。尝试使用7.3(当前的稳定版本)。