Когда вы вызываете SvREFCNT($arrayref)
, вы получаете счетчик ссылок arrayref , а не array , на который он ссылается.newRV_inc
увеличивает счетчик ссылок на array
, а newRV_noinc
- нет.Но это не имеет никакого значения для подсчета ссылок arrayref
.(Я не думаю, что вы можете получить пересчет массива, на который ссылается arrayref с Devel :: Peek.)
Вы читали пример в perlguts: подсчет ссылок и смертность ?
AV* array = newAV()
создает новый массив с refcount 1. 1. В make_arrayref_inc
, newRV_inc
увеличивает это значение до 2 при создании нового SV (arrayref) с refcount 1. Это вызываетутечка памяти, потому что вы не уменьшаете счет array
перед выходом из функции.Perl считает, что у него есть 2 ссылки, но на самом деле он имеет только 1, поэтому он никогда не будет собирать мусор до тех пор, пока интерпретатор не отключится.
Вот почему вы обычно используете newRV_noinc
в коде, который возвращает ссылку на недавносозданная ценность.Это более эффективно, чем использовать newRV_inc
, а затем SvREFCNT_dec
.Вы можете думать о newRV_noinc
как о передаче права собственности на AV от array
до arrayref
.