如何在V8中存储持久句柄?

时间:2014-03-25 21:22:58

标签: c++ pointers copy v8 noncopyable

我希望我的班级成员v8::Contextv8::External。因此,我认为我必须使用持久句柄。

class ScriptHelper {
public:
    ScriptHelper(v8::Persistent<v8::Context> Context) : context(Context) {
        // ...
    }
    // ...
private:
    v8::Persistent<v8::Context> context;
    v8::Persistent<v8::External> external;
};

但是,持久句柄在V8中是不可复制的,因此代码无法编译。错误发生在两个元素初始化的行中。对于上下文,这是在构造函数的初始化列表中,对于外部的,它位于构造函数体内。

  

1&GT;错误C2440:'=':无法从'v8 :: Primitive *'转换为'v8 :: Object * volatile'
  1 GT;指向的类型是无关的;转换需要reinterpret_cast,C风格的演员或函数式演员   1 GT; include \ v8 \ v8.h(603):参见函数模板实例化'void v8 :: NonCopyablePersistentTraits :: Uncompilable(void)'正在编译

我考虑过使用指向持久句柄的指针,但这似乎是反直觉的,因为句柄的概念已经暗示了某种参考。此外,我认为手柄会被破坏,以便V8的内部垃圾收集器可以清理对象。

如何将V8对象永久存储为类成员?

更新:即使我使用指向持久句柄的指针,我也会为返回持久句柄的方法获得相同的编译器错误。

1 个答案:

答案 0 :(得分:14)

默认情况下,持久句柄使用不可复制的特征。明确地将可复制特征作为模板参数传递使它们像以前的版本一样工作。

Persistent<Value, CopyablePersistentTraits<Value>> persistent(isolate, value);