我有一个程序,它使用Javascript作为脚本语言绑定到一个更大的C++应用程序。我交替使用V8和webkit,但是底层的运行时应该与这个问题无关。
在这个应用程序中,我动态创建的对象会收到回调。我将像这样创建这个回调绑定...
function f() {
var obj = CreateNewCallbackObj();
obj.onCallback = dowork; // dowork is a function
}显然,这会有GC问题,因为obj已经超出范围,最终将被删除。
我想要的是让对象自我管理其生命周期。该对象最终将收到一个回调,该回调将发出生命结束的信号,当发生这种情况时,它可以删除自己。
一种想法是通过添加obj.myself=obj来自我引用。这似乎是错误的方式,但它可能会工作,除非垃圾收集算法是智能的。
有没有正确的方法来做这件事?没有构建用于存储对象的底层持久化DOM,所有JS对象都是根据需要动态分配的,但需要一些方法留在JS引擎中。
发布于 2011-03-28 02:54:34
自我引用并不能保证任何东西都活着。事实上,没有一种有自尊的GC语言实现(据我所知)只使用了拒绝计数。甚至不要想着滥用GC算法或任何其他实现定义的细节-那样才是疯狂的。
至于替代方案:创建一些始终可达(例如,全局)的对象,它包含所有这些对象(并因此使它们保持活动状态),并提供一个删除对象的方法。然后祈祷没有其他人得到推荐信--或者更好的是,不要担心这个。GC的全部意义在于,您不应该(必须)知道/关心内存何时释放。
您还可以添加一个alive属性,在所有方法的开头进行检查,如果方法在!this.alive时被调用,则会引发错误-当然,这并不能保证,但它可能有助于调试。
https://stackoverflow.com/questions/5451426
复制相似问题