V8的文档解释了如何创建包装C++对象的Javascript对象.Javascript对象保持指向C++对象实例的指针.我的问题是,假设您在堆上创建C++对象,如何在gc收集Javascript对象时收到通知,这样您就可以释放堆分配的C++对象?
诀窍是创建一个Persistent
句柄(链接到API引用的第二个项目符号:" Persistent
句柄不保存在堆栈上,只有在你专门删除它们时才被删除....当你需要保留一个句柄时使用一个持久句柄引用多个函数调用的对象,或者当句柄生命周期与C++范围不对应时.")并调用MakeWeak()
它,传递一个将执行必要清理的回调函数("一个持久句柄可以变弱,Persistent::MakeWeak
当对对象的唯一引用来自弱持久句柄时,使用,来触发来自垃圾收集器的回调." - 也就是说,当所有"常规"句柄超出范围并且垃圾收集器即将删除时宾语).
该Persistent::MakeWeak
方法的签名是:
void MakeWeak(void* parameters, WeakReferenceCallback callback);
其中WeakReferenceCallback
定义为带有两个参数的指向函数的指针:
typedef void (*WeakReferenceCallback)(Persistent
这些可在v8.h头文件中找到,该文件随V8一起分发为公共API.
您希望传递给的函数MakeWeak
清除在Persistent
被称为回调时将传递给它的对象参数.void* parameter
可以忽略该参数(或者void* parameter
可以指向包含需要清理的对象的C++结构):
void CleanupV8Point(Persistent