C语言 何时释放 PHP 扩展中的内存



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

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

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

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

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

在这种情况下,不需要使用 emalloc 分配内存,

只需使用 zval *pt[10] 或将其减少为单个可重用zvalMAKE_STD_ZVAL将处理所有内存(de)分配和引用计数的东西。

相关内容

  • 没有找到相关文章

最新更新