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
指针?
证据源代码在哪里显示我应该或不应该这样做?
答案 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
而你需要删除指针手动