v8 :: Persistent不会持续超出包含v8 :: HandleScope

时间:2019-04-18 23:29:27

标签: 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这样的整数,程序将运行并输出相同的值。现在,问题变得更加神秘。

1 个答案:

答案 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(当前的稳定版本)。