pos*_*ist 24 javascript c++ v8
V8的文档解释了如何创建包装C++对象的Javascript对象.Javascript对象保持指向C++对象实例的指针.我的问题是,假设您在堆上创建C++对象,如何在gc收集Javascript对象时收到通知,这样您就可以释放堆分配的C++对象?
Max*_*ert 23
诀窍是创建一个Persistent句柄(链接到API引用的第二个项目符号:" Persistent句柄不保存在堆栈上,只有在你专门删除它们时才被删除....当你需要保留一个句柄时使用一个持久句柄引用多个函数调用的对象,或者当句柄生命周期与C++范围不对应时.")并调用MakeWeak()它,传递一个将执行必要清理的回调函数("一个持久句柄可以变弱,Persistent::MakeWeak当对对象的唯一引用来自弱持久句柄时,使用,来触发来自垃圾收集器的回调." - 也就是说,当所有"常规"句柄超出范围并且垃圾收集器即将删除时宾语).
该Persistent::MakeWeak方法的签名是:
void MakeWeak(void* parameters, WeakReferenceCallback callback);
Run Code Online (Sandbox Code Playgroud)
其中WeakReferenceCallback定义为带有两个参数的指向函数的指针:
typedef void (*WeakReferenceCallback)(Persistent<Object> object,
void* parameter);
Run Code Online (Sandbox Code Playgroud)
这些可在v8.h头文件中找到,该文件随V8一起分发为公共API.
您希望传递给的函数MakeWeak清除在Persistent<Object>被称为回调时将传递给它的对象参数.void* parameter可以忽略该参数(或者void* parameter可以指向包含需要清理的对象的C++结构):
void CleanupV8Point(Persistent<Object> object, void*)
{
// do whatever cleanup on object that you're looking for
object.destroyCppObjects();
}
Parameter<ObjectTemplate> my_obj(ObjectTemplate::New());
// when the Javascript part of my_obj is about to be collected
// we'll have V8 call CleanupV8Point(my_obj)
my_obj.MakeWeak(NULL, &CleanupV8Point);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5118 次 |
| 最近记录: |