Php 是否使用zval_ptr_dtor或FREE_zval

Php 是否使用zval_ptr_dtor或FREE_zval,php,php-extension,Php,Php Extension,我在代码中使用zval类型,如果我使用zval_ptr_dtor释放内存,结果如下。当我使用gdb调试它时,我不明白为什么会出现这个错误 /vagrant_data/php-5.6.25/Zend/zend_execute.h(79) : Block 0x7ffff063f2b3 status: /vagrant_data/php-5.6.25/Zend/zend_variables.c(37) : Actual location (location was relayed) Invalid p

我在代码中使用zval类型,如果我使用zval_ptr_dtor释放内存,结果如下。当我使用gdb调试它时,我不明白为什么会出现这个错误

/vagrant_data/php-5.6.25/Zend/zend_execute.h(79) : Block 0x7ffff063f2b3 status:
/vagrant_data/php-5.6.25/Zend/zend_variables.c(37) : Actual location (location was relayed)
Invalid pointer: ((thread_id=0x00000000) != (expected=0xF7FF0700))

Program received signal SIGSEGV, Segmentation fault.
0x000000000064bb28 in zend_mm_check_ptr (heap=0xb6a180, ptr=0x7ffff063f2b3, silent=0, __zend_filename=0x8f1e78 "/vagrant_data/php-5.6.25/Zend/zend_execute.h", __zend_lineno=79, 
    __zend_orig_filename=0x8f4a00 "/vagrant_data/php-5.6.25/Zend/zend_variables.c", __zend_orig_lineno=37) at /vagrant_data/php-5.6.25/Zend/zend_alloc.c:1384
1384        if (p->info._size != ZEND_MM_NEXT_BLOCK(p)->info._prev) {
这是我的密码

zval *z;
MAKE_STD_ZVAL(z);
ZVAL_STRING(z, "this is a test", 0);
zval_set_refcount_p(z, 1);
zval_ptr_dtor(&z);

zval\u ptr\u dtor
接受一个
zval**
,但您正在交一个
zval*
。使用
zval\u dtor

一般来说,您应该始终使用
zval_ptr_dtor
zval_dtor
检查ref计数器,而
FREE_zval
weill
efree
(PHP版本的FREE)变量,无论引用计数如何。因此,如果其他人持有参考资料,您将在免费后使用