Portál AbcLinuxu, 10. května 2025 13:20

Dotaz: perl, pamět pro proměnné

25.8.2005 13:36 Zdenek Stryhal | skóre: 10 | blog: ZS
perl, pamět pro proměnné
Přečteno: 126×
Odpovědět | Admin

Zdravim.

Pokud jste nekdo sběhlej v perlu, můžete mi poradit, jak je to s proměnnými mimo jejich "scope". Domníval jsem se, že dojde k uvolnění paměti poté co již proměnná "neexistuje". Pokud však existuje reference, můžu její obsah stále používat.

Existuje snad záznam, že existuje na proměnnou odkaz? Dojde k jejímu vymazání(uvolnění paměti) když už neexistuje žádný odkaz?

my $y;
{
my @x=(20,30); # @x je lokalni
$y=\@x;
}

print $x[0]; # chyba, $x neex.

print $y->[0]; # vporadku, vypise 20

undef $y;

# je stale rezevovana pamet pro pole (20,30) ?

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

25.8.2005 14:02 hrobar | skóre: 13
Rozbalit Rozbalit vše Re: perl, pamět pro proměnné
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ja si myslim ze ten odkaz sa nevytvara na samotnu premennu ale na miesto v pamati. Takze to ze x uz neexistuje znamena len to ze neexistuje odkaz na dane pamatove miesto cez premennu x. O pamat ktora je obsadena napriek tomu ze uz nanu nic neukazuje si myslim ze sa stara garbage colector. To je moj odhad ale moze to byt aj blud.
25.8.2005 14:27 Zdenek Stryhal | skóre: 10 | blog: ZS
Rozbalit Rozbalit vše Re: perl, pamět pro proměnné

Souhlasím, že odkaz na proměnnou je vlastne odkaz na místo v paměti. Chápu také stejně, že neexistence proměnné je vlastně neexistence odkazu přes jméno.

Je však možná a v manuálech doporučená kostrukce, která vytvoří odkaz na bezejmenné pole:


my $z;
{
my $y=[20,30];
$z=$y;
}
print $z->[0];  #Pole "$y" je dostupné i mimo blok

Pole "$y" je možné z dále zvětšovat a měnit obsah, aniž by docházelo k přepisování jiných proměnných nebo seg.fault.

25.8.2005 14:19 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
Rozbalit Rozbalit vše Re: perl, pamět pro proměnné
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nechce se mi to nejak debugovat, ale po 'undef $y;' se tomu poli snizi pocet referenci na nulu a melo by se uvolnit. Jediny problem by nastal, kdybys mel strukturu, kde by se ty ukazatele zacyklily, to Perl AFAIK nedetekuje.
25.8.2005 14:33 Zdenek Stryhal | skóre: 10 | blog: ZS
Rozbalit Rozbalit vše Re: perl, pamět pro proměnné

Aha, je tedy pravdivá moje doměnka, že k poli je někde záznam, zda na něj něco ukazuje? Vytvoření reference k poli tedy není jen prosté zaznamenání "adresy" v paměti, ale dojde při tom i k záznamu, že tato reference k danému poli existuje.

Díky

25.8.2005 15:35 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
Rozbalit Rozbalit vše Re: perl, pamět pro proměnné
Tak nejak, rika se tomu pocitani referenci.
25.8.2005 15:45 Zdenek Stryhal | skóre: 10 | blog: ZS
Rozbalit Rozbalit vše Re: perl, pamět pro proměnné
Díky moc, to jsem potřeboval.
25.8.2005 16:07 ivast
Rozbalit Rozbalit vše Re: perl, pamět pro proměnné
Odpovědět | | Sbalit | Link | Blokovat | Admin
Uhadol ste uplne presne, obsah premennej je zniceny potom, ako pocet odkazov na tento obsah klesne na 0.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.