如果我用一个我从不期望返回perl的哈希编写一些XS代码,我是否必须释放它?如果是这样,怎么样?
我最接近的是hv_undef,但这只是清除哈希的内容,而不是我理解的哈希本身。
HV* hash = newHV();
...
use the hash
...
hv_undef(hash);
答案 0 :(得分:10)
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);
答案 1 :(得分:7)
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));