我要手动删除v8::External中的指针吗?
Shall I delete the pointer manually in v8::External?
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
手动创建对象,那么当不再需要它时,您还必须手动 delete
它。如果你不删除它,那么你的程序将运行,但它会泄漏内存。如果你过早删除它(而其他对象仍然有指向它的指针),那么这就是所谓的 "use-after-free" 错误,它通常会导致崩溃并可以被利用。
这与 V8 无关。 v8::External
无法自动删除您的对象,因为它不知道您的应用程序如何工作——只有 您 知道何时可以安全删除对象,以及必须如何删除它们 ( a void*
不了解析构函数)。
V8 的 Persistent
句柄可以标记为 "weak" 并在 V8 的 GC 即将释放它们所引用的对象时调用回调。但是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 计划。
如果您希望 v8::External
为您删除 TestExternal
类型的对象,那么您应该以某种方式让它知道它正在管理 TestExternal
.[=15 的对象=]
因为这通常是通过 class 模板完成的并且 v8::External
没有声明为模板,我猜它可能不会为你调用 delete
而你需要手动删除指针。
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
手动创建对象,那么当不再需要它时,您还必须手动 delete
它。如果你不删除它,那么你的程序将运行,但它会泄漏内存。如果你过早删除它(而其他对象仍然有指向它的指针),那么这就是所谓的 "use-after-free" 错误,它通常会导致崩溃并可以被利用。
这与 V8 无关。 v8::External
无法自动删除您的对象,因为它不知道您的应用程序如何工作——只有 您 知道何时可以安全删除对象,以及必须如何删除它们 ( a void*
不了解析构函数)。
V8 的 Persistent
句柄可以标记为 "weak" 并在 V8 的 GC 即将释放它们所引用的对象时调用回调。但是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 计划。
如果您希望 v8::External
为您删除 TestExternal
类型的对象,那么您应该以某种方式让它知道它正在管理 TestExternal
.[=15 的对象=]
因为这通常是通过 class 模板完成的并且 v8::External
没有声明为模板,我猜它可能不会为你调用 delete
而你需要手动删除指针。