perl – 了解newRV_inc vs newRV_noinc
发布时间:2020-12-16 06:25:05 所属栏目:大数据 来源:网络整理
导读:在尝试处理C级别的参考时,我似乎无法弄清楚newRV_inc和newRV_noinc之间的差异(实际上).为此,我已经模拟了这个小的Inline :: C示例. #!/usr/bin/env perluse strict;use warnings;use Devel::Peek 'SvREFCNT';my $arrayref_inc = make_arrayref_inc();print "
在尝试处理C级别的参考时,我似乎无法弄清楚newRV_inc和newRV_noinc之间的差异(实际上).为此,我已经模拟了这个小的Inline :: C示例.
#!/usr/bin/env perl use strict; use warnings; use Devel::Peek 'SvREFCNT'; my $arrayref_inc = make_arrayref_inc(); print "inc: ",SvREFCNT($arrayref_inc),"n"; my $arrayref_noinc = make_arrayref_noinc(); print "noinc: ",SvREFCNT($arrayref_noinc),"n"; use Inline C => <<'END_C'; SV* make_arrayref_inc () { AV * array = newAV(); SV * arrayref = newRV_inc((SV *)array); return arrayref; } SV* make_arrayref_noinc () { AV * array = newAV(); SV * arrayref = newRV_noinc((SV *)array); return arrayref; } END_C 得到: inc: 1 noinc: 1 任何人都可以帮助我理解为什么这段代码会这样做? 解决方法
当您调用SvREFCNT($arrayref)时,您将获得arrayref的引用计数,而不是它引用的数组. newRV_inc增加数组的引用计数,newRV_noinc不增加.但这对arrayref的引用计数没有任何影响. (我认为你不能得到带有Devel :: Peek的arrayref引用的数组的引用计数.)
你有没有看过perlguts: Reference Counts and Mortality的例子? AV * array = newAV()创建一个refcount为1的新数组.在make_arrayref_inc中,newRV_inc在创建一个refcount为1的新SV(arrayref)时将其递增为2.这会导致内存泄漏,因为你不知道在退出函数之前减小数组的引用计数. Perl认为它有2个引用,但它实际上只有1个,所以在解释器关闭之前它永远不会被垃圾收集. 这就是为什么你通常在返回对新创建的值的引用的代码中使用newRV_noinc的原因.它比使用newRV_inc然后使用SvREFCNT_dec更有效.您可以将newRV_noinc视为将AV的所有权从数组转移到arrayref. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |