[Warszawa-pm] Scope::Guard

Piotr Fusik piotr w fusik.info
Pią, 12 Paź 2012, 00:47:39 PDT


Dnia 2012-10-12 09:19 Tadeusz Sośnierz napisał(a):

>On Fri, 12 Oct 2012 09:09:40 +0200, Piotr Fusik <piotr w fusik.info> wrote:
>
>> Perl nie jest tu wyjątkiem: tak samo jest w Java, C#, JavaScript.
>> Wszystkie te języki mają garbage collector, którego zadaniem jest  
>> zwalnianie
>> pamięci w programie, ale nie kontrola zasobów takich jak otwarte pliki.
>
>Tu nie do końca. W Perlu nie ma jednak garbage collectora, który "jak
>zbierze to zbierze". Jest reference counting, i teoretycznie wychodząc ze
>scope wskaźnik powinien się zmniejszać, a obiekt sam zwalniać; tak jak
>robi to Gobject a za tym i np. Vala.

Racja. W takim razie nie rozumiem, dlaczego w Perlu nie ma destruktorów.

>Ciekawostką, którą ostatnio wypatrzyłem przy okazji czytania o
>Devel::SizeMe jest taki przypadek:
>
>sub foo {
>       my $var = 'a' x 100_000;
>}
>
>Pytanie, kiedy zostanie zwolniona pamięć zaalokowana na $var? Okazuje się,
>że nigdy. O ile skalar $var oczywiście nie będzie już tam rezydował, o
>tyle Perl i tak nie zwolni tej pamięci systemowi; będzie ją trzymał po to,
>żeby przy następnym wejściu do funkcji nie alokować jej ponownie. Zabawne.

Jeśli ta pamięć jest dostępna na inne zmienne Perla to ok.
Myślę, że nie jest tak łatwo zwrócić pamięć z własnej sterty do systemu.

Piotr


Więcej informacji o liście Warszawa-pm