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

4
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指针吗?

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


3
你为什么一开始要用 new 来创建它? - juanchopanza
@juanchopanza,如果我不使用new,那我该怎么办呢?根据V8的嵌入指南,我需要使用new - XadillaX
@juanchopanza 文档中没有提到这一点。所以我很困惑。 - XadillaX
如果没有说明,则很可能 External::New() 不需要创建新的对象,而由调用者清理。这意味着您不需要使用 new 关键字创建对象。 - juanchopanza
一些类似的代码表明它可以被“new”出来。但是没有地方说明是否需要手动删除。 - XadillaX
显示剩余3条评论
2个回答

2
是的,C++需要手动管理内存:如果您使用new手动创建对象,则在不再需要时还必须手动delete它。如果您不删除它,则程序将正常工作,但会泄漏内存。如果您过早地删除它(而其他对象仍然有指向它的指针),那么这就是“使用后释放”错误,通常会导致崩溃并被利用。
关于此,与V8无关。 v8::External不能自动删除您的对象,因为它不知道您的应用程序如何工作--只有您知道何时可以安全地删除对象以及如何删除它们(void*不知道析构函数)。
V8的Persistent处理句柄可以标记为“弱”,并在V8的GC即将释放它们所引用的对象时调用回调函数。然而,v8.h中的文档强烈建议不要依赖此功能:

注意:不能保证回调何时甚至是否被调用。调用仅基于最佳努力原则执行。始终不要依赖基于GC的终结来进行任何关键形式的资源管理!

因此,您应该在C ++端跟踪所有对象并制定一些备选方案来释放它们。

谢谢,我也从Node.js的源代码中得到了这个答案。Node.js的ObjectWrap使用Persistent::SetWeak方式来跟踪指针。 - XadillaX

0

如果您希望v8::External代表您删除类型为TestExternal的对象,则应该以某种方式让它知道它正在管理TestExternal的对象。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接