Reference counting (and getting it right) is one least well documented parts of the perl API. I'm never sure if I have it right. But:
On Mon, Jul 21, 2003 at 12:40:48PM -0600, Shane Corgatelli wrote: > hash = (HV*)SvRV( col_vals ); > num_keys = hv_iterinit( hash ); > for ( i = 0; i < num_keys; i++ ) { > hash_entry = hv_iternext( hash ); > sv_key = hv_iterkeysv( hash_entry ); > sv_val = hv_iterval( hash, hash_entry ); > > sv_setpvn( sv_new_key, "_col_", 5 ); > sv_catsv( sv_new_key, sv_key ); > key = SvPV( sv_new_key, keylen ); > > hv_store( members, key, keylen, sv_val, 0 ); > } > hv_iterinit( hash ); > return; > } > > When I run this, I get 'Attempt to free unreferenced scalar' warnings. If I > try to run it multiple times I will eventually get segmentation fault. So > after reading perlguts and scanning this list I changed the hv_store call to > be: > > hv_store( members, key, keylen, SvREFCNT_inc(sv_val), 0 ); You need that. The hash assumes that it is being given the reference you pass it. But without the SvREFCNT_inc there is only one reference to sv_val, and the other hash (also) thinks that it owns it. You were probably also leaking memory even when you didn't have this. > Now everything works, but I'm getting memory leaks. I've also tried to clone > sv_val using newSVsv() but with the same results. I'm not sure what I'm doing > wrong. I've had a look, and I'm not sure either. I'm about to head off to YAPC::EU, so I'm not going to have another chance to look until next week. Hopefully someone else will solve it before then. Nicholas Clark