Wydaje się, że wiele osób ma wrażenie, że po zwolnieniu pamięci natychmiast wraca do systemu operacyjnego i może być używana przez inne programy.
To nie jest prawda. Systemy operacyjne zwykle zarządzają pamięcią na stronach 4KiB. malloc
a inne rodzaje zarządzania pamięcią pobierają strony z systemu operacyjnego i zarządzają nimi podrzędnie według własnego uznania. Jest całkiem prawdopodobne, że free()
będzie nie wrócić strony do systemu operacyjnego, przy założeniu, że program będzie więcej pamięci malloc później.
Nie twierdzę, że free()
nigdy nie zwraca pamięci do systemu operacyjnego. Może się to zdarzyć, szczególnie jeśli uwalniasz duże obszary pamięci. Ale nie ma gwarancji.
Ważny fakt: jeśli nie zwolnisz pamięci, której już nie potrzebujesz, kolejne centra handlowe będą zużywać jeszcze więcej pamięci. Ale jeśli najpierw zwolnisz, malloc może ponownie użyć zwolnionej pamięci.
Co to oznacza w praktyce? Oznacza to, że jeśli wiesz, że twój program nie będzie odtąd wymagał więcej pamięci (na przykład jest w fazie czyszczenia), zwolnienie pamięci nie jest tak ważne. Jeśli jednak program może później przydzielić więcej pamięci, należy unikać wycieków pamięci - szczególnie takich, które mogą się powtarzać.
Zobacz także ten komentarz, aby uzyskać więcej informacji na temat tego, dlaczego zwalnianie pamięci tuż przed zakończeniem jest złe.
Komentator wydawał się nie rozumieć, że wywołanie free()
nie pozwala automatycznie innym programom na korzystanie z uwolnionej pamięci. Ale o to chodzi w tej odpowiedzi!
Tak więc, aby przekonać ludzi, pokażę przykład, w którym free () robi niewiele dobrego. Aby matematyka była łatwa do naśladowania, będę udawać, że system operacyjny zarządza pamięcią na 4000 bajtowych stronach.
Załóżmy, że alokujesz dziesięć tysięcy 100-bajtowych bloków (dla uproszczenia zignoruję dodatkową pamięć, która byłaby wymagana do zarządzania tymi alokacjami). To zużywa 1 MB lub 250 stron. Jeśli następnie uwolnisz 9000 tych bloków losowo, pozostanie tylko 1000 bloków - ale są one rozproszone po całym miejscu. Statystycznie około 5 stron będzie pustych. Pozostałe 245 będą miały co najmniej jeden przydzielony blok. Daje to 980 KB pamięci, której system operacyjny nie może odzyskać - mimo że teraz masz przydzielone tylko 100 KB!
Z drugiej strony, możesz teraz malloc () 9000 kolejnych bloków bez zwiększania ilości pamięci, którą program wiąże.
Nawet jeśli techniczniefree()
może zwrócić pamięć do systemu operacyjnego, może tego nie zrobić. musi osiągnąć równowagę między szybkim działaniem a oszczędnością pamięci. Poza tym program, który już przydzielił dużo pamięci, a następnie zwolnił, prawdopodobnie zrobi to ponownie. Serwer WWW musi obsłużyć żądanie za żądaniem po żądaniu - sensowne jest utrzymywanie dostępnej „luźnej” pamięci, aby nie trzeba było cały czas pytać systemu operacyjnego o pamięć.free()