C++ 我应该在v8::External中手动删除指针吗? localtpl=ObjectTemplate::New(隔离); tpl->SetInternalFieldCount(1); 本地ret=tpl->NewInstance(); TestExternal*ex=新的TestExternal(); ret->SetInternalField(0,外部::新建(隔离,ex));

C++ 我应该在v8::External中手动删除指针吗? localtpl=ObjectTemplate::New(隔离); tpl->SetInternalFieldCount(1); 本地ret=tpl->NewInstance(); TestExternal*ex=新的TestExternal(); ret->SetInternalField(0,外部::新建(隔离,ex));,c++,v8,C++,V8,当ret不再使用时,是否应手动删除ex指针 证据源代码显示我应该或不应该这样做? < P>是的,C++需要手动内存管理:如果手动创建一个带有新< /C>的对象,那么当它不再需要时,也必须手动“代码>删除< /代码>它。如果您不删除它,那么您的程序将工作,但它将泄漏内存。如果您过早地删除它(而其他对象仍然有指向它的指针),那么这就是所谓的“释放后使用”错误,它通常会导致崩溃,并可被利用 关于这一点,V8没有什么特别的。v8::External无法自动删除您的对象,因为它不知道您的应用程序如何工作—

ret
不再使用时,是否应手动删除
ex
指针


证据源代码显示我应该或不应该这样做?

< P>是的,C++需要手动内存管理:如果手动创建一个带有<代码>新< /C>的对象,那么当它不再需要时,也必须手动“代码>删除< /代码>它。如果您不删除它,那么您的程序将工作,但它将泄漏内存。如果您过早地删除它(而其他对象仍然有指向它的指针),那么这就是所谓的“释放后使用”错误,它通常会导致崩溃,并可被利用

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

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

注意:不保证回调何时或是否成功 调用。调用仅在尽力而为的基础上执行。 与往常一样,任何情况下都不应依赖基于GC的终结 资源管理的关键形式


这样,您应该在C++侧跟踪所有对象,并有一些计划B来释放它们。

< P>如果您期望代码> V8::外部< /代码>删除一个类型为“代码>测试外部/<代码>的对象,那么您应该让它知道它正在管理一个对象:代码>测试外部< /COD>
由于这通常是通过类模板完成的,并且
v8::External
没有声明为模板,因此我猜测它可能不会为您调用
delete
,您需要手动删除指针。

为什么您首先要
new
它?@juanchopanza
TestExternal
是我自己的类,不是v8的一类。我用
v8::External
把它包装起来,让它成为
ret
的一个内部字段。但你为什么要
new
它呢?@juanchopanza所以如果我不
new
它,我该怎么办?I
new
它符合Embedder的V8指南。不知道,但是文档应该告诉您该怎么做。它是否告诉您传递一个新指针?如果是这样,它会说谁应该删除它吗?谢谢,我也从Node.js的源代码中得到了这个答案。js的ObjectWrap使用
Persistent::SetWeak
方法跟踪指针。
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));