もし私がperlに返すことを期待していないハッシュを使ってXSコードを書いたら、それを解放する必要がありますか?もしそうなら、どうですか?newHVで作成したHV *を解放する必要はありますか?
最も近いのはhv_undefですが、これはハッシュ自体の内容ではなく、ハッシュの内容をクリアすることだけです。
HV* hash = newHV();
...
use the hash
...
hv_undef(hash);
もし私がperlに返すことを期待していないハッシュを使ってXSコードを書いたら、それを解放する必要がありますか?もしそうなら、どうですか?newHVで作成したHV *を解放する必要はありますか?
最も近いのはhv_undefですが、これはハッシュ自体の内容ではなく、ハッシュの内容をクリアすることだけです。
HV* hash = newHV();
...
use the hash
...
hv_undef(hash);
newHV
は、(のようなnewSV
、newAV
など)you just need to decrement it to 0、それを解放するには1に、新しく作成された値の参照カウントを設定します。 HVSのためにそのための特別な機能はこれだけSvREFCNT_dec
を使用し、ありません:
HV* hash = newHV();
/*
* use the hash
*/
SvREFCNT_dec((SV *) hash);
newHV
はそのHV
にあなたのコードの保留を意味する、1の参照カウント(REFCNT)とHV
を返します。 HV
で終わったら、refcntを減らしてホールドを解除する必要があります。これを行うには3つの一般的な方法があります。
ここで今すぐ削除してください。
SvREFCNT_dec((SV*)hv);
// hv is no longer safe to use here.
AV
とHV
はSV
の "サブクラス" です。
発信者がそれを参照する機会を得た後に、それを終了します。 (実際にはハッシュには適用されません。)
return sv_2mortal(sv);
転送 "所有権"。あなたはそれで終わったときには、同様にrv
であなたの保留を解除する必要があります
rv = newRV((SV*)hv);
SvREFCNT_dec((SV*)hv);
注短いです
rv = newRV_noinc((SV*)hv);
ので、あなたは、多くの場合、次のように表示されます:
return sv_2mortal(newRV_noinc((SV*)hv));
スーパー。私はSVのサブクラスとしてのHVの部分は私の頭の中で働いていなかったと思う。これは素晴らしいです。 –