2016-09-13 2 views
1

Я использую тип zval в своем коде, если я использую zval_ptr_dtor для освобождения памяти, это будет результат ниже. Когда я использую gdb для его отладки, я смущаюсь о том, почему эта ошибка появляется.использовать zval_ptr_dtor или FREE_ZVAL

/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); 

ответ

1

См http://www.phpinternalsbook.com/zvals/memory_management.html

zval_ptr_dtor занимает zval**, но вы отдаете в zval*. Используйте zval_dtor.

Вообще говоря, Вы должны всегда использовать zval_ptr_dtor или zval_dtor, как они проверяют на refcounter в то время как FREE_ZVAL Вайля efree (версия РНР свободной) с помощью переменной, независимо от счетчика ссылок. Поэтому, если у кого-то еще есть ссылка, вы столкнетесь с без использования.