in reply to Memory leaks and reference counting within Perl.
This shows that when some reference to the my %monks outlives the block, my %monks is allocated a new hash, and otherwise it reuses the same space.my @AoH; for (0..9) { my %monks = ( Zaxo => 'W. Virginia', tye => 'California', theorbtwo => 'Germany', castaway => 'Germany', atcroft => 'Georgia', rozallin => 'England', ); print "\%monks is at address ", 0+\%monks, "\n"; # save a reference every other iteration $AoH[$_/2] ||= \%monks; } print "\%{\$AoH[$_]} is at address ", 0+$AoH[$_], "\n" for 0..$#AoH; __END__ %monks is at address 269696284 %monks is at address 269696716 %monks is at address 269696716 %monks is at address 269696812 %monks is at address 269696812 %monks is at address 269696908 %monks is at address 269696908 %monks is at address 269697004 %monks is at address 269697004 %monks is at address 269706344 %{$AoH[0]} is at address 269696284 %{$AoH[1]} is at address 269696716 %{$AoH[2]} is at address 269696812 %{$AoH[3]} is at address 269696908 %{$AoH[4]} is at address 269697004
When the "leaked" references become undefined (by the array elements being set to something else or the array going out of scope) the hashes referred to are indeed freed, unless a circular reference is created (e.g. $AoH[0]{ref}=$AoH[0]).
|
---|