如果我编写了一些 XS 代码,其中包含我从未期望返回到 perl 的哈希值,我是否必须释放它?如果是这样,怎么做?
我想出的最接近的是 hv_undef,但据我所知,这只是清除散列的内容,而不是散列本身。
HV* hash = newHV();
...
use the hash
...
hv_undef(hash);
如果我编写了一些 XS 代码,其中包含我从未期望返回到 perl 的哈希值,我是否必须释放它?如果是这样,怎么做?
我想出的最接近的是 hv_undef,但据我所知,这只是清除散列的内容,而不是散列本身。
HV* hash = newHV();
...
use the hash
...
hv_undef(hash);
newHV
(如newSV
,newAV
等)将新创建的值的引用计数设置为 1。要释放它,您只需将其递减为 0。对于 HV,没有特殊功能,所以只需使用SvREFCNT_dec
:
HV* hash = newHV();
/*
* use the hash
*/
SvREFCNT_dec((SV *) hash);
newHV
返回HV
一个引用计数 (refcnt) 为 1 的 ,表示您的代码持有该HV
. 完成后HV
,您必须通过减少它的 refcnt 来释放对它的持有。有三种常见的方法来做到这一点。
在这里和现在完成它。
SvREFCNT_dec((SV*)hv);
// hv is no longer safe to use here.
AV
并且HV
是 的“子类” SV
。
在调用者有机会引用它之后完成它。(实际上并不适用于哈希。)
return sv_2mortal(sv);
所有权转让”。
rv = newRV_noinc((SV*)hv);
这是缩写
rv = newRV((SV*)hv);
SvREFCNT_dec((SV*)hv);
请注意,您必须rv
在完成后同样释放对它的保留,因此您经常会看到以下内容:
return sv_2mortal(newRV_noinc((SV*)hv));