如果我用一个散列写一些XS代码,我从来没有想过会返回到perl,那么我需要释放它吗?如果是这样,怎么样?我需要释放由newHV创建的HV *吗?
我最近想到的是hv_undef,但这只是从我所了解的内容中清除散列的内容,而不是散列本身。
HV* hash = newHV();
...
use the hash
...
hv_undef(hash);
如果我用一个散列写一些XS代码,我从来没有想过会返回到perl,那么我需要释放它吗?如果是这样,怎么样?我需要释放由newHV创建的HV *吗?
我最近想到的是hv_undef,但这只是从我所了解的内容中清除散列的内容,而不是散列本身。
HV* hash = newHV();
...
use the hash
...
hv_undef(hash);
newHV
(如newSV
,newAV
等)在新创建的值的引用计数为1。要释放它,you just need to decrement it to 0。有对,对的HV没有特殊的功能,因此就使用SvREFCNT_dec
:
HV* hash = newHV();
/*
* use the hash
*/
SvREFCNT_dec((SV *) hash);
newHV
返回一个的引用计数(refcnt)的HV
,对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));
超级。我想HV的一部分作为SV的一个子类并不适合我。这很好。 –