如何在perl中创建对象的弱引用,所以当对象超出范围时,引用计数被释放?
我已经尝试使用DESTROY子来打破循环引用。
sub DESTROY{
my $p = shift;
delete $p->{__tree__};
delete $p->{tokenizers};
delete $p->{toke};
}
请帮忙。
答案 0 :(得分:4)
你不能打电话"销毁 - 这里的问题是perl在引用计数上工作 - 对事物的每个引用都被计算,当引用计数降为零时,它只是 ,它可能被释放/销毁/垃圾收集
DESTROY
是一个特殊的方法,在对象内调用,以便在发生这种情况时执行清理任务 。它不会删除对象,它只是让它在它死亡时做一些最后的整理。
查看Scalar::Util
模块。它包含weaken
方法,它完全符合您的要求。
左值$ ref将变为弱引用。这意味着它不会在它引用的对象上保留引用计数。此外,当该对象上的引用计数达到零时,引用将设置为undef。该函数改变作为参数传递的左值,并且不返回任何值。
这对于保留引用的副本非常有用,但是您不希望在通常的时间阻止对象被删除。
答案 1 :(得分:3)
来自perldoc:
您可以通过创建“弱引用”来中断循环引用。弱引用不会增加变量的引用计数,这意味着该对象可能超出范围并被销毁。您可以使用Scalar::Util模块导出的弱化函数来弱化参考。
以下是我们如何使第一个示例更安全:
use Scalar::Util 'weaken';
my $foo = {};
my $bar = { foo => $foo };
$foo->{bar} = $bar;
weaken $foo->{bar};
从
$foo
到$bar
的引用被削弱了。当$bar
变量超出范围时,它将被垃圾收集。下次查看$foo->{bar} key
的值时,它将为undef
。远处的这个动作可能令人困惑,所以你应该小心使用弱化。您应该削弱变量中的引用,该引用将超出范围 first 。这样,寿命较长的变量将包含预期的引用,直到它超出范围。