PHP拡張モジュールに配列の配列を作成して返したいと思います。私が理解するところでは、emalloc()
を使用して配列要素の領域を割り当てる必要がありますが、私が理解できないのは、解放することが適切なときです。私はこれに似たPHP機能を持っている:PHP拡張モジュールのメモリを解放するのはいつですか?
pt
に割り当てられたメモリを解放する必要があり
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]);
}
}
?
私は 'MAKE_STD_ZVAL()'の直後に 'array_init(pt [i]);'を呼び出して、例に追加するのを忘れてしまいました。したがって、正しく理解すれば 'MAKE_STD_ZVAL()'はメモリの割り当てを担当し、参照カウントが0になったときにメモリの割り当てが解除されるので(emalloc()は呼び出さないでください) PHPで範囲外になったとき、それが一度しか参照されていない場合)。 – rid
@Raduはい、 'MAKE_STD_ZVAL'は(emalloc'で)zvalも割り当てます。しかし、最初の 'emalloc'の呼び出しでは、zvalを割り振りません。同じzibgではない10個のzval *の配列を割り当てています。 'actual'と同様に、ローカル変数を使用することもできますし、配列を完全に破棄して、次のようにすることもできます:' {zval * zv; MAKE_STD_ZVAL(zv); add_index_double(zv、0、1); add_index_zval(return_value、i、zv); } '。 – Artefacto