8

perl に戻らないと思われるハッシュを含む XS コードを書いた場合、それを解放する必要がありますか? もしそうなら、どのように?

私が思いついた最も近いのは hv_undef ですが、それは私が理解していることから、ハッシュ自体ではなく、ハッシュの内容をクリアするだけです。

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

2 に答える 2

10

newHV (like newSV, newAV, etc.) sets the reference count of the newly created value to 1. To free it, you just need to decrement it to 0. There's no special function for that for HVs, so just use SvREFCNT_dec:

HV* hash = newHV();
/*
 * use the hash
 */
SvREFCNT_dec((SV *) hash);
于 2012-12-24T21:46:55.247 に答える
7

newHVHVは、参照カウント (refcnt) が 1 の を返します。これは、コードがその を保持していることを示しますHV。それが終わったらHV、refcnt をデクリメントして保持を解除する必要があります。これを行うには、3 つの一般的な方法があります。

  1. 今ここでそれで終わりです。

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

    AVHVは の「サブクラス」ですSV

  2. 呼び出し元がそれを参照する機会を得た後、それを実行します。(実際にはハッシュには適用されません。)

    return sv_2mortal(sv);
    
  3. 「所有権」を譲渡します。

    rv = newRV_noinc((SV*)hv);
    

    それはの略です

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

    同様に、作業が終わったらホールドを解除する必要があることに注意してくださいrv。そのため、多くの場合、次のように表示されます。

    return sv_2mortal(newRV_noinc((SV*)hv));
    
于 2012-12-25T04:50:03.387 に答える