2012-12-24 10 views
8

もし私がperlに返すことを期待していないハッシュを使ってXSコードを書いたら、それを解放する必要がありますか?もしそうなら、どうですか?newHVで作成したHV *を解放する必要はありますか?

最も近いのはhv_undefですが、これはハッシュ自体の内容ではなく、ハッシュの内容をクリアすることだけです。

HV* hash = newHV(); 
... 
use the hash 
... 
hv_undef(hash); 

答えて

10

newHVは、(のようなnewSVnewAVなど)you just need to decrement it to 0、それを解放するには1に、新しく作成された値の参照カウントを設定します。 HVSのためにそのための特別な機能はこれだけSvREFCNT_decを使用し、ありません:

HV* hash = newHV(); 
/* 
* use the hash 
*/ 
SvREFCNT_dec((SV *) hash); 
+0

スーパー。私はSVのサブクラスとしてのHVの部分は私の頭の中で働いていなかったと思う。これは素晴らしいです。 –

7

newHVはそのHVにあなたのコードの保留を意味する、1の参照カウント(REFCNT)とHVを返します。 HVで終わったら、refcntを減らしてホールドを解除する必要があります。これを行うには3つの一般的な方法があります。

  1. ここで今すぐ削除してください。

    SvREFCNT_dec((SV*)hv); 
    // hv is no longer safe to use here. 
    

    AVHVSVの "サブクラス" です。

  2. 発信者がそれを参照する機会を得た後に、それを終了します。 (実際にはハッシュには適用されません。)

    return sv_2mortal(sv); 
    
  3. 転送 "所有権"。あなたはそれで終わったときには、同様にrvであなたの保留を解除する必要があります

    rv = newRV((SV*)hv); 
    SvREFCNT_dec((SV*)hv); 
    

    注短いです

    rv = newRV_noinc((SV*)hv); 
    

    ので、あなたは、多くの場合、次のように表示されます:

    return sv_2mortal(newRV_noinc((SV*)hv)); 
    
関連する問題