如果我用一個散列寫一些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的一個子類並不適合我。這很好。 –