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

如何释放包装的C++;当关联的Javascript对象在V8中被垃圾收集时?,javascript,c++,v8,Javascript,C++,V8,V8的文档解释了这一点。JavaScript对象保存指向C++对象实例的指针。我的问题是,如果你在堆上创建C++对象,那么当GC收集JavaScript对象时,你如何得到通知,这样,如果垃圾收集的语言可以保存对语言引擎外部资源的引用,那么你可以免费释放分配的C++对象?< p>。(文件,套接字,或者C++中的对象),你应该提供一个“关闭”方法来尽快释放资源,直到GC认为有必要破坏你的对象为止,没有点等待。 P>如果你的C++对象内存不足,垃圾收集对象只是一个引用:你可以分配数千个对象,GC只看

V8的文档解释了这一点。JavaScript对象保存指向C++对象实例的指针。我的问题是,如果你在堆上创建C++对象,那么当GC收集JavaScript对象时,你如何得到通知,这样,如果垃圾收集的语言可以保存对语言引擎外部资源的引用,那么你可以免费释放分配的C++对象?

< p>。(文件,套接字,或者C++中的对象),你应该提供一个“关闭”方法来尽快释放资源,直到GC认为有必要破坏你的对象为止,没有点等待。
<> P>如果你的C++对象内存不足,垃圾收集对象只是一个引用:你可以分配数千个对象,GC只看到一些KB的微小对象,不足以触发集合;而C++侧则与几十个陈旧对象纠缠在一起。(指对象或功能)。
然后,当您超出范围时,可以安全地移除C++对象。GC不检查指向对象存在的指针。

< P>技巧是创建一个<代码>持久性<代码>句柄(从链接到API引用的第二个弹头点:“<代码>持久性<代码>句柄不被保存在堆栈上,只有在您删除它们时才被删除……当需要对一个对象保持引用以进行多个函数调用时,或者使用句柄不对应于C++范围时,使用持久句柄”,并调用<代码>在其上,传递一个回调函数,该函数将执行必要的清理(“当对对象的唯一引用来自弱持久句柄时,可以使用
persistent::MakeWeak
使持久句柄变弱,以触发来自垃圾回收器的回调。”--也就是说,当所有“常规”句柄“句柄已超出范围,垃圾回收器即将删除对象时)

Persistent::MakeWeak
方法签名是:

void MakeWeak(void* parameters, WeakReferenceCallback callback);
其中,
WeakReferenceCallback
被定义为指向函数的指针,该函数包含两个参数:

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

这就是为什么会有函数V8::AdjustAmountOfExternalAllocatedMemory()…这样,您就可以告诉V8您的对象饿了…:-)如何对本地对象执行此操作?我正在尝试从构造函数FunctionTemplate中执行此操作。我想不出一个不会对我大喊大叫的语法。尝试过。Make虚弱但不存在,尝试过Persistent::New,但它需要指向我的对象的指针,而我的编译器不允许我创建指向本地对象的指针。@xaxxon:我将是第一个承认我没有任何使用V8 Javascript引擎的经验(六年前我碰巧从文档中找到了这个问题的答案)。我认为您的问题的答案是上的示例,但也有可能您自己有一个值得问的问题。谢谢。我最终找到了答案。从第1400行开始,提供的热链接(可能很长时间)已经失效。对它可能包含的内容的合理猜测是:
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);