gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:01:06 25 4
gpt4 key购买 nike

V8 的文档解释了 how to create a Javascript object that wraps a C++ object . Javascript 对象持有指向 C++ 对象实例的指针。我的问题是,假设你在堆上创建了 C++ 对象,当 Javascript 对象被 gc 收集时,如何获得通知,以便释放堆分配的 C++ 对象?

最佳答案

诀窍是创建一个 Persistent句柄(链接到 API 引用中的第二个要点:“Persistent 句柄不保存在堆栈中,仅当您专门删除它们时才会删除它们。...当您需要保留对对象用于多个函数调用,或者当句柄生命周期不对应于 C++ 范围时。”),并调用 MakeWeak()在它上面,传递一个回调函数,该函数将进行必要的清理(“可以使用 Persistent::MakeWeak 使持久句柄变弱,以在对对象的唯一引用来自弱持久句柄时触发来自垃圾收集器的回调。” -- 也就是说,当所有“常规”句柄都超出范围并且垃圾收集器即将删除对象时)。

Persistent::MakeWeak方法签名是:

void MakeWeak(void* parameters, WeakReferenceCallback callback);

在哪里 WeakReferenceCallback被定义为一个带有两个参数的函数指针:

typedef void (*WeakReferenceCallback)(Persistent<Object> object,
void* parameter);

这些可以在与 V8 作为公共(public) API 一起分发的 v8.h 头文件中找到。

你会想要你传递给 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);

关于javascript - 当关联的 Javascript 对象在 V8 中被垃圾收集时,如何释放包装的 C++ 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/173366/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com