2016-09-13 10 views
1

zval_ptr_dtorを使用してメモリを解放すると、私のコードでzvalタイプが使用されますが、その結果は以下のようになります。デバッグに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) { 

私のコードを参照してくださいhttp://www.phpinternalsbook.com/zvals/memory_management.html

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

ある

zval_ptr_dtorzval**がかかりますが、あなたはzval*に手渡しています。 zval_dtorを使用してください。

は、一般的にしばらくFREE_ZVALワイルefree(無料のPHPのバージョン)に関係なく、参照カウントの変数彼らはrefcounterをチェックしているとあなたは常にzval_ptr_dtorまたはzval_dtorを使用する必要があります話します。したがって、誰かが参照を保持している場合は、使用後フリーに実行されます。

関連する問題