我要手动删除v8::External中的指针吗?

Shall I delete the pointer manually in v8::External?

Local<ObjectTemplate> tpl = ObjectTemplate::New(isolate);
tpl->SetInternalFieldCount(1);
Local<Object> ret = tpl->NewInstance();
TestExternal* ex = new TestExternal();
ret->SetInternalField(0, External::New(isolate, ex));

ret 不再使用时,我是否可以手动删除 ex 指针?

证据源代码在哪里表明我应该或不应该这样做?

是的,C++ 需要手动内存管理:如果您使用 new 手动创建对象,那么当不再需要它时,您还必须手动 delete 它。如果你不删除它,那么你的程序将运行,但它会泄漏内存。如果你过早删除它(而其他对象仍然有指向它的指针),那么这就是所谓的 "use-after-free" 错误,它通常会导致崩溃并可以被利用。

这与 V8 无关。 v8::External 无法自动删除您的对象,因为它不知道您的应用程序如何工作——只有 知道何时可以安全删除对象,以及必须如何删除它们 ( a void* 不了解析构函数)。

V8 的 Persistent 句柄可以标记为 "weak" 并在 V8 的 GC 即将释放它们所引用的对象时调用回调。但是v8.h中的文档强烈建议不要依赖这个:

NOTE: There is no guarantee as to when or even if the callback is invoked. The invocation is performed solely on a best effort basis. As always, GC-based finalization should not be relied upon for any critical form of resource management!

因此,您应该在 C++ 端跟踪所有对象,并制定一些释放它们的 B 计划。

如果您希望 v8::External 为您删除 TestExternal 类型的对象,那么您应该以某种方式让它知道它正在管理 TestExternal.[=15 的对象=]

因为这通常是通过 class 模板完成的并且 v8::External 没有声明为模板,我猜它可能不会为你调用 delete 而你需要手动删除指针。