6

PHP拡張機能で配列の配列を作成して返したいのですが。私が理解していることから、を使用して配列要素にスペースを割り当てる必要がありますemalloc()が、私が理解していないのは、それを解放することが適切な場合です。私はこれに似たPHP関数を持っています:

PHP_FUNCTION(test)
{
    int i;
    zval **pt = emalloc(sizeof(zval*) * 10);

    array_init(return_value);

    for (i = 0; i < 10; ++i) {
        MAKE_STD_ZVAL(pt[i]);
        array_init(pt[i]);
        add_index_double(pt[i], 0, 1);
        add_index_zval(return_value, i, pt[i]);
    }
}

割り当てられたメモリはどこで解放すればよいptですか?

4

2 に答える 2

6

この場合、そうする必要はありません。返す変数が破棄されると、そのメモリは解放されます。配列を返すので、その時間までに配列のすべての要素も破棄されます(より正確には、配列が削除されると、その時点までに他の参照がない場合にのみ、参照カウントが減少します)それらは解放されます)。

を呼び出すことにより、zvalの参照カウントを手動で減らすことができますzval_ptr_dtor。参照カウントが0に達すると、メモリも解放されます。

技術的には、配列変数は。によって支えられていHashTableます。変数が破棄されると、ハッシュテーブルも破棄されます。これにより、asに関連付けられた「デストラクタコールバック」HashTableも、各ハッシュテーブル要素を引数として1回呼び出されます。を呼び出すと、デストラクタ関数としてのarray_initハッシュテーブルも作成されます。zval_ptr_dtor

emallocまた、ここでは2か所で電話をかけることに注意してください。1つは明示的で、もう1つは経由MAKE_STD_ZVALです。最初のものは不要ですが、使用する場合はefree、関数が戻る前に呼び出す必要があります。そうしないと、PHP変数のような自動メモリ管理メカニズムに関連付けられていないため、メモリリークが発生します。

于 2012-04-10T17:46:36.283 に答える
1

emallocこの場合、を使用してメモリを割り当てる必要はありません。使用するzval *pt[10]か、単一の再利用可能に減らすだけでzvalMAKE_STD_ZVALすべてのメモリ(非)割り当てと参照カウントを処理します。

于 2012-04-10T17:45:51.087 に答える