Re: destroying an array and using a new one

From: Date: Thu, 21 Jun 2012 03:51:47 +0000
Subject: Re: destroying an array and using a new one
References: 1  Groups: php.internals 
Request: Send a blank email to internals+get-60911@lists.php.net to get a copy of this message
On Thu, Jun 21, 2012 at 11:39 AM, Yader Hernandez <yader.hernandez@gmail.com> wrote: > I'm trying to reverse an array but I keep getting bizarre results, such as > seg faults > > 0x00000000006d0940 in gc_remove_from_buffer (zv=0x7fffffffb550) at > /home/yaderbh/php-5.4.3/Zend/zend_gc.h:189 > 189 root->next->prev = root->prev; > > or I'll get "PHP Fatal error:  Allowed memory size of" errors when trying > to manipulate the array in a script. > > Basically what I'm doing is creating a pointer to zval, allocating and > creating the zval into an array, traversing the existing array and > calling add_index_zval. The position of the index is the current size and > work my way down. > > >    hash_table = Z_ARRVAL_P(intern->elements); > > > >    ALLOC_INIT_ZVAL(new_elements); > >    array_init(new_elements); > > > >    zend_hash_internal_pointer_reset_ex(hash_table, &pos); > > > >    i = intern->size; > > > >    while (zend_hash_get_current_data_ex(hash_table, (void **)&current, > &pos) == SUCCESS) { >        tmp = **current; Hi: tmp is a stack allocted variable. when this scope is dead, *(&tmp) is undefined value. you should use a heap allocated variable, or just add_ref the current zval thanks > > > >        zval_copy_ctor(&tmp); > > > >        add_index_zval(new_elements, i, &tmp); > >        i--; > > > >        zend_hash_move_forward_ex(hash_table, &pos); > >    } > > > >    zval_ptr_dtor(&intern->elements); > > > >    intern->elements = new_elements; > > > Can anyone spot the problem? -- Laruence  Xinchen Hui http://www.laruence.com/

« previous php.internals (#60911) next »