我想在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?
在这种情况下,您不必.当您要返回的变量被销毁时,其内存将被释放.由于您正在返回一个数组,因此该数组的所有元素也将被销毁(更准确地说,删除数组时它们的引用计数会减少,只有当它们没有其他引用时才会被删除他们被释放了.
您可以通过调用手动减少zval的引用计数zval_ptr_dtor.当其引用计数达到0时,这也将释放其内存.
从技术上讲,数组变量由a支持HashTable.当变量被销毁时,哈希表也会被销毁.通过这个,"析构函数回调"与被HashTable调用的一样,一次以每个哈希表元素作为参数.当您调用时array_init,它还会创建一个带有zval_ptr_dtor析构函数的哈希表.
另请注意,您emalloc在此处拨打两个地方的电话.第一个是明确的,另一个是通过MAKE_STD_ZVAL.第一个是不必要的,但是如果你使用它,你应该efree在函数返回之前调用,否则它的内存泄漏,因为它与PHP变量之类的任何自动内存管理机制都没有关联.
| 归档时间: |
|
| 查看次数: |
1387 次 |
| 最近记录: |