Package AAA;
sub new {
my $ref;
$ref = \$ref;
return bless \$ref;
}
类似这样的循环引用,确实 undef 会不靠谱, 但是 perl 本身的 two-phased garbage collection 机制仍然会保证 new 出来的对象在最后时刻被 DESTORY 掉, 也就是在 perl 的 global destruction 过程中被析构。
像这种情况下:
my $obj = AAA->new;
$$obj = "destory";
undef $obj;
这样应该就没有问题了?
我想楼主问的应该是一般情况下的做法,一般情况下 undef 就OK了吧?
我有个问题问 agent, 如何方便的知道,某个变量/值当前的引用计数是多少?
2009/5/13 agentzh <agentzh@gmail.com>
呃。。。undef 一般可以将原先引用的值的引用计数减 1,一般可以减到 0,所以一般会触发随后的回收(但经常也不是立即回收)。如果被 undef 掉的值的引用计数已经大于 1 的话,则 undef 将失效,呵呵。。。(当然,没做 weaken 的循环引用的东西就更没戏了,呵呵)
一般地,除非在 XS 级别上做一些手脚,将一个要回收的东西的引用计数全部置为 0(不知有无现成的 CPAN 模块?),perl 几乎总是使用引用计数这种所谓的“穷人的GC”(但同时比 JVM 那种 GC 更廉价)。
Cheers,
-agentzh
--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛
-~----------~----~----~----~------~----~------~--~---
没有评论:
发表评论