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手动创建对象,则还必须在不再需要时手动删除它.如果你不删除它,那么你的程序将工作,但它会泄漏内存.如果你过早地删除它(而其他对象仍然有指针),那么这就是所谓的“免费后使用”错误,这通常会导致崩溃并被利用.
关于这一点,V8没有具体的内容. v8 :: External无法自动删除您的对象,因为它不知道您的应用程序是如何工作的 – 只有您知道何时可以安全地删除对象,以及必须如何删除它们(void *不知道析构函数).
当V8的GC即将释放他们所指的对象时,V8的持久句柄可以被标记为“弱”并调用回调.但是,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来释放它们.