in reply to Re: Use of freed value in iteration
in thread Use of freed value in iteration

Does anyone know what this is any different?

Yes, there is a bug on one of the modules you are using, that returns perl scalars with a wrong reference count. Perl perform an integrity check looking for this kind of errors inside for loops and that was why you were seeing the "Use of freed value in iteration" message.

And now, you are not using the faulty values, but copies of them (@userids). Perl doesn't see any problem because it's not looking at the faulty values any more... but that doesn't mean you have solved it, it's just hidden, waiting to crash your program at any time!!!

Replies are listed 'Best First'.
Re^3: Use of freed value in iteration
by kwetal (Initiate) on Apr 14, 2012 at 17:19 UTC
    I succeeded in generating this error with a pure perl program (v5.10.1 (*) built for i686-cygwin-thread-multi-64int) with the following code:
    #!/usr/bin/perl -w use strict; use Data::Dumper; $Data::Dumper::Indent = 1; my $hashref; for my $i0 (1..2) { for my $i1 (1..2) { for my $i2 (1..2) { $hashref->{"$i0"}{"$i0:$i1"}{"$i0:$i1:$i2"} = "$i0:$i1:$i2"; } } } deletehashlevel($hashref, 1); print Dumper($hashref); exit; sub athashleveldo { my ($h, $n, $action) = @_; if ($n==0) { $action->($h); } else { athashleveldo($_, $n-1, $action) for values %$h; } } sub deletehashlevel { my ($h, $n) = @_; athashleveldo($h, $n, sub { my %tmp; for my $key (keys %$h) { my $val = delete $h->{$key}; @tmp{keys %$val} = values %$val; } %$h = %tmp; }); } __END__
    Running this program:
    $ ./testhashdel Use of freed value in iteration at ./testhashdel line 27.
    The error goes away when I apply the same solution as js1 did, replacing:
    athashleveldo($_, $n-1, $action) for values %$h;
    with
    my @v = values %$h; athashleveldo($_, $n-1, $action) for @v;
    Is this a bug in Perl, lurking to bite me at some later time?
      Hello,

      I confirm the problem with strawberry portable v5.12.3 32bit. The next I have is 5.20.3 and runs with no errors

      L*

      There are no rules, there are no thumbs..
      Reinvent the wheel, then learn The Wheel; may be one day you reinvent one of THE WHEELS.
      No error in 5.14.2 for i586-linux-thread-multi.
      Confirmed in perl, v5.10.1 (*) built for x86_64-linux-gnu-thread-multi (debian squeeze) but not in perl 5, version 14, subversion 2 (v5.14.2) built for x86_64-linux-gnu-thread-multi (Ubuntu 12.04 Precise).