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

rid*_*rid 6 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]);
    }
}
Run Code Online (Sandbox Code Playgroud)

我应该在哪里释放分配的内存pt

Art*_*cto 6

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

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

从技术上讲,数组变量由a支持HashTable.当变量被销毁时,哈希表也会被销毁.通过这个,"析构函数回调"与被HashTable调用的一样,一次以每个哈希表元素作为参数.当您调用时array_init,它还会创建一个带有zval_ptr_dtor析构函数的哈希表.

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