何时释放PHP扩展中的内存?

时间:2012-04-10 16:45:23

标签: c php-extension

我想在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分配的内存?

2 个答案:

答案 0 :(得分:6)

在这种情况下,您不必。当您要返回的变量被销毁时,其内存将被释放。由于您正在返回一个数组,因此该数组的所有元素也将被销毁(更准确地说,删除数组时它们的引用计数会减少,只有当它们没有其他引用时才会被删除他们被释放了。)

您可以通过调用zval_ptr_dtor手动减少zval的引用计数。当它的引用计数达到0时,它也会释放它的内存。

从技术上讲,数组变量由HashTable支持。当变量被销毁时,哈希表也会被销毁。通过这个,与HashTable相关联的“析构函数回调”也被调用,一次将每个哈希表元素作为参数。当您调用array_init时,它还会创建一个使用zval_ptr_dtor作为析构函数的哈希表。

另请注意,您在此处的两个地方拨打了emalloc。第一个是显式的,另一个是通过MAKE_STD_ZVAL。第一个是不必要的,但如果你使用它,你应该在函数返回之前调用efree否则它的内存泄漏,因为它与PHP变量之类的任何自动内存管理机制都没有关联。

答案 1 :(得分:1)

在这种情况下,无需使用emalloc分配内存,只需使用zval *pt[10]或将其缩减为单个可重用zvalMAKE_STD_ZVAL将处理所有内存(de )分配和引用计数。