Jeśli zaprogramowałem - nie wiedząc o tym - wyciek pamięci i aplikacja zakończy pracę, to czy wyciekła pamięć zostanie uwolniona?
Jeśli zaprogramowałem - nie wiedząc o tym - wyciek pamięci i aplikacja zakończy pracę, to czy wyciekła pamięć zostanie uwolniona?
Odpowiedzi:
Tak, „wyciek pamięci” to po prostu pamięć, do której proces nie ma już odniesienia, a zatem nie może już zostać zwolniony. System operacyjny nadal śledzi całą pamięć przydzieloną procesowi i zwolni ją po zakończeniu tego procesu.
W zdecydowanej większości przypadków system operacyjny zwolni pamięć - tak jak w przypadku zwykłych „odmian” systemów Windows, Linux, Solaris itp. Należy jednak pamiętać, że w wyspecjalizowanych środowiskach, takich jak różne systemy operacyjne czasu rzeczywistego, pamięć może nie zostać zwolniona po zakończeniu programu.
System operacyjny wykonujący program zwykle czyści pamięć, która nie jest jawnie zwalniana i obsługuje, które nie są jawnie zamykane, ale standard C ++ nie gwarantuje tego. Możesz znaleźć wbudowane urządzenie, które nie zwalnia wycieków pamięci.
Biorąc to pod uwagę, Windows i wszystkie dystrybucje Linuksa, które kiedykolwiek widziałem, uwalniają wycieki pamięci.
Możesz jednak łatwo utworzyć ogromną pętlę wycieków pamięci, aby przetestować ją samodzielnie. Obserwuj wzrost wykorzystania pamięci RAM, a następnie zamknij program. Zobaczysz, że użycie pamięci RAM spada.
Inną kwestią podczas używania C ++ jest to, że jeśli nie usuwasz pamięci przydzielonej na stertę, to twoje destruktory również nie są wywoływane. Czasami będziesz miał również inne efekty uboczne, jeśli twoje destruktory nie zostaną wywołane.
Zwykle tak. Niektóre systemy obsługują takie rzeczy, jak bloki pamięci współdzielonej, które nie są automatycznie zwalniane po zakończeniu programu. Większość nadal zachowuje liczbę odniesień i usuwa je, gdy wszystkie programy, które go otworzyły, kończą pracę, ale kilka nie (np. 16-bitowy system Windows miał kilka typów elementów, które pozostałyby przydzielone, nawet jeśli nic się do nich nie odnosiło - chociaż zwykle ulegał awarii z innych powodów, zanim zgromadziło się wystarczająco dużo, aby spowodować problem ...)
Zależy od tego, jakie wspomnienie wyciekłeś. Część pamięci nie może zostać odzyskana przez system operacyjny. Jednak większość pamięci w większości systemów operacyjnych zostanie automatycznie odzyskana po zakończeniu procesu.