【问题标题】:How to store persistent handles in V8?如何在 V8 中存储持久句柄?
【发布时间】:2014-05-04 00:03:12
【问题描述】:

我希望我的班级拥有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 中是不可复制的,因此代码无法编译。错误发生在两个成员被初始化的行中。对于上下文,this 在构造函数的初始化列表中,对于外部的 this 在构造函数体中。

1> 错误 C2440:“=”:无法从“v8::Primitive *”转换为“v8::Object *volatile”
1> 指向的类型不相关;转换需要 reinterpret_cast、C 样式转换或函数样式转换
1> include\v8\v8.h(603) : 请参阅正在编译的函数模板实例化 'void v8::NonCopyablePersistentTraits::Uncompilable(void)' 的参考

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

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

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

【问题讨论】:

  • 如果你做ScriptHelper(v8::Handle&lt;v8::Context&gt; Context) : context(Context) {,你会避免错误。你真正想要传递的是context,所以你应该只使用一般的Handle而不是特定类型的句柄。
  • @loganfsmyth 那么我可以使用Handle&lt;Context&gt; 作为成员类型吗?
  • 不,你仍然会使用持久成员。
  • @loganfsmyth 好的,谢谢。

标签: c++ pointers copy v8 noncopyable


【解决方案1】:

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

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

【讨论】:

  • 谢谢@danijar!就我而言,我试图使用 Persistent&lt;Value&gt;::New(isolate, value) 显然不允许 CopyablePersistentTraits&lt;Value&gt; 作为第二个参数。不过,您创建上述对象的方式非常有效。
  • 太棒了。这行得通,但现在 MakeWeak 不再是 Persistent 了:(
  • 嗨@danijar,我已经使用您的策略从Persistent 获取Local,似乎不再起作用,可能是因为我没有利用构造函数?你能帮我看看这个post吗?
猜你喜欢
  • 1970-01-01
  • 2012-11-15
  • 2021-05-23
  • 1970-01-01
  • 2012-05-20
  • 2017-07-08
  • 2012-05-07
  • 2012-06-10
  • 2012-08-13
相关资源
最近更新 更多