Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zwalnianie pamięci
Forum PHP.pl > Forum > PHP > Object-oriented programming
pp-layouts
Wydaje mi się, że w PHP generalnie nie ma konieczności jawnego definiowania destruktorów obiektu, chyba, że chce się, żeby coś "na do widzenia" zrobiły, pamięć gdzie się tylko da jest automatycznie zwalniana, ale czy na pewno?

Powiedzmy, że mam wewnątrz metody coś takiego: $x = new krowa(); ..... return $x->wynik; Powiedzmy, że krowa to krowiasty obiekt, zawierający sporo danych. W mojej metodzie interesuje mnie tylko jedna właściwość tego obiektu, którą zwracam. Po każdym return $x->wynik pamięć obiektu jest zwalniana, prawda?

marcio
Nie wiem na ile dziala "gb" w php potestuj sobie.

Jesli jednak nie ufasz to poprostu uzyj destruktor i tyle w klasie ktora jest "krowiasta".

darko
Samo return $x->wynik pamięci nie zwolni. Możesz jawnie zwalniać pamięć poprzez unset($x); ale w tym przypadku, kiedy zwracasz coś z metody, sposób ten się nie sprawdzi. Napisz może, do czego zmierzasz, bo - powiedzmy - "krowiasty obiekt" mnie zaciekawił winksmiley.jpg
Zyx
PHP używa licznika referencji do określania czy pamięć należy zwolnić czy nie. unset usuwa jedynie referencję, a sam obiekt znika dopiero wtedy, gdy usunięta zostanie ostatnia. Wersje PHP poniżej 5.3.0 nie potrafią wykrywać cykli, tzn. obiekt A wskazuje na B, B na A, lecz do żadnego z nich nie ma dostępu z reszty skryptu. Dopiero najnowsze PHP potrafi się tym zająć, choć można to wyłączyć, a ponadto na bugtrackerze są zgłoszone jakieś niepotwierdzone przez twórców błędy o wyciekach pamięci. Osobiście skłaniam się ku temu, że jakieś wycieki tam są, bo to niemożliwe jest, żeby po wyczyszczeniu ilość zajętej pamięci... rosła.
XianN
Polecam lekture*: garbage collector, powinna wyjasnic wszelkie watpliwosci.

--
* - RTFM!
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.