当前位置:  开发笔记 > 编程语言 > 正文

当关联的Javascript对象在V8中被垃圾收集时,如何释放包装的C++对象?

如何解决《当关联的Javascript对象在V8中被垃圾收集时,如何释放包装的C++对象?》经验,为你挑选了1个好方法。

V8的文档解释了如何创建包装C++对象的Javascript对象.Javascript对象保持指向C++对象实例的指针.我的问题是,假设您在堆上创建C++对象,如何在gc收集Javascript对象时收到通知,这样您就可以释放堆分配的C++对象?



1> Max Lybbert..:

诀窍是创建一个Persistent句柄(链接到API引用的第二个项目符号:" Persistent句柄不保存在堆栈上,只有在你专门删除它们时才被删除....当你需要保留一个句柄时使用一个持久句柄引用多个函数调用的对象,或者当句柄生命周期与C++范围不对应时.")并调用MakeWeak()它,传递一个将执行必要清理的回调函数("一个持久句柄可以变弱,Persistent::MakeWeak当对对象的唯一引用来自弱持久句柄时,使用,来触发来自垃圾收集器的回调." - 也就是说,当所有"常规"句柄超出范围并且垃圾收集器即将删除时宾语).

Persistent::MakeWeak方法的签名是:

void MakeWeak(void* parameters, WeakReferenceCallback callback);

其中WeakReferenceCallback定义为带有两个参数的指向函数的指针:

typedef void (*WeakReferenceCallback)(Persistent object,
                                      void* parameter);


这些可在v8.h头文件中找到,该文件随V8一起分发为公共API.

您希望传递给的函数MakeWeak清除在Persistent被称为回调时将传递给它的对象参数.void* parameter可以忽略该参数(或者void* parameter可以指向包含需要清理的对象的C++结构):

void CleanupV8Point(Persistent object, void*)
{
    // do whatever cleanup on object that you're looking for
    object.destroyCppObjects();
}

Parameter 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);

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有