in reply to Dangling Pointer::perl referrence
but the referrence still exist
Of course. You never changed $arr_r.
Is it same as "Dangling Pointer" in C???
No. A dangling pointer is a pointer to something that doesn't exist anymore. You didn't even try to get rid of the array — undef simply empties it — so there's definitely no dangling pointer.
Even if you tried to get rid of the array (like in the following example), you wouldn't get a dangling. The reference would keep it alive until you got rid of the reference too.
my $ref; { my @array = 'element'; $ref = \@array; } # Because the array is lexically scoped (my), # the array would normally be freed here*, # but the reference is keeping it alive. print "$ref->[0]\n"; # Prints 'element' $ref = undef; # The scalar stops referencing the array, # so it's freed here.
Think of my as new.
my @outer; for (1..2) { my @inner = "pass $_"; push @outer, \@inner; } print "@{ $outer[0] }\n"; # pass 1 print "@{ $outer[1] }\n"; # pass 2
But realize that Perl will get rid of something automatically as soon as noone needs it anymore. For example, if that entire piece of code was in a sub, @outer and the two @inner would get freed by the subroutine exit code*.
One catch: Perl sometimes doesn't realize nothing needs a value anymore. It occurs when you have a reference cycle like the following:
for (1..10) { my $r1; my $r2 = \$r1; my $r3 = \$r2; $r1 = \$r3; } # You have just leaked 30 variables.
* — Aside from optimisations that would only confuse the issue.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: Dangling Pointer::perl referrence
by Anonymous Monk on Feb 17, 2010 at 23:05 UTC | |
by ikegami (Patriarch) on Feb 18, 2010 at 01:46 UTC | |
by jethro (Monsignor) on Feb 18, 2010 at 00:14 UTC |