Perl中的弱引用

时间:2015-06-24 08:40:36

标签: perl garbage-collection

如何在perl中创建对象的弱引用,所以当对象超出范围时,引用计数被释放?
我已经尝试使用DESTROY子来打破循环引用。

sub DESTROY{  
my $p = shift;  
delete $p->{__tree__};  
delete $p->{tokenizers};  
delete $p->{toke};  
}

请帮忙。

2 个答案:

答案 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 。这样,寿命较长的变量将包含预期的引用,直到它超出范围。