我应该在v8 :: External中手动删除指针吗?

时间:2017-05-14 06:52:58

标签: c++ v8

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));

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

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

2 个答案:

答案 0 :(得分:2)

是的,C ++需要手动内存管理:如果您使用new手动创建对象,则还必须在不再需要时手动delete它。如果你不删除它,那么你的程序将工作,但它会泄漏内存。如果你过早地删除它(而其他对象仍然有指针),那么这就是所谓的“免费后使用”错误,这通常会导致崩溃并被利用。

V8没有具体的内容。 v8::External无法自动删除您的对象,因为它不知道您的应用程序是如何工作的 - 只有知道何时可以安全地删除对象,以及如何删除它们({{1} 1}}不知道析构函数。)

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

  

注意:无法保证何时甚至如果回调是     调用。调用仅在尽力而为的基础上执行。     与往常一样,基于GC的终结应该依赖于任何     资源管理的关键形式!

所以你应该跟踪C ++方面的所有对象,并有一些计划B来释放它们。

答案 1 :(得分:0)

如果您希望v8::External为您删除TestExternal类型的对象,那么您应该知道它正在管理TestExternal的对象。

由于这通常是通过类模板完成的,并且v8::External未被声明为模板,我的猜测是它可能不会为你调用delete而你需要删除指针手动