v8::P ersistent 不会持久到包含 v8::HandleScope 的块之外

  • 本文关键字:v8 HandleScope 包含 ersistent c++ v8
  • 更新时间 :
  • 英文 :


我有这个简短的程序来测试 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 年开始的。它可能很奇怪,和/或当前的文档可能不再适用于它。升级后,针对这样的旧 API 开发新应用程序会导致一些移植工作,因此我建议立即从最新版本开始。尝试当前稳定版本 7.3。

最新更新