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也被调用,一次将每个哈希表元素作为参数。当您调用 时array_init,它还会创建一个带有zval_ptr_dtor析构函数的哈希表。

另请注意,您在此处的两个地方拨打电话emalloc。第一个是显式的,另一个是 via 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 回答