我有一个使用Boehm GC实施的个人项目。我需要实现一种事件类型,该事件类型应包含对其他事件的引用。但是我还需要确保指向的事件仍然可以收集,因此我需要为此提供较弱的引用。
比方说,我们有事件A,B和C。我将这些事件配置为在发出信号X时发出信号X。这意味着A,B和C必须持有对事件X的引用。我想要的是,如果事件X无法访问,则事件A,B和C不再需要发出信号了。因此,我想到的只是一个薄弱的参考。
还有其他方法吗?我不想更改GC,但如有必要(分配接口保持干净),我可以更改。
该项目用C编写。如有需要,我将提供更多信息。值得注意的是,如果有任何一种方法可以直接使用这种语义直接实现此类事件,则不需要实际的弱引用(事件可以有一个引用周期,尽管它们没有发出信号)。
答案 0 :(得分:3)
Boehm GC本身并没有弱引用的概念。但是,它不会扫描系统malloc
分配的内存以引用对被管理对象,因此存储在此类内存中的指针不会阻止收集指向的对象。当然,这种方法意味着包含指针的对象将不会由收集器管理。
或者,应该有可能滥用GC_MALLOC_ATOMIC()
或GC_malloc_explicitly_typed()
来获取一个托管对象,该对象可以包含指向其他托管对象的指针,而又不会阻止收集这些其他对象。基本上,这涉及向GC投诉某些成员是否为指针,以防止对其进行扫描。
无论哪种方式,您都需要某种机制来在收集弱引用的对象时接收通知,从而避免以后尝试访问它们。 GC具有一个用于注册finalizer回调的接口,该回调在收集对象之前被调用,这看起来是您为此目的最好的选择。
总的来说,我认为您所要求的是可行的,但是涉及很多DIY。
GC_MALLOC_ATOMIC()
在指向弱引用对象的指针周围分配包装对象。通过这种方式分配,可以使包装程序本身由GC管理,而在GC的可达性分析过程中不会扫描内部的指针。GC_register_finalizer
注册一个终结器函数,当GC判定指向的对象不可访问时,该终结器函数将包装器的指针设置为NULL
。NULL
。