加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读