Czy wyciekła pamięć jest zwalniana po zamknięciu programu?


Odpowiedzi:


151

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.


4
Pytanie: CZY system operacyjny śledzi wszystkie przydziały? Każda przydzielona przez ciebie pamięć sterty pochodzi z wirtualnej przestrzeni pamięci procesu - kiedy proces się kończy, ta przestrzeń jest zwracana hurtowi systemowemu, prawda? Nie rozumiem, dlaczego dodatkowe księgowanie byłoby konieczne, ponieważ proces dokonywania alokacji jest i tak jedynym procesem (w obszarze użytkownika), który ma dostęp do tych stron. A może źle mnie nauczono?
Chris Tonkinson

6
@Justin: Bez znajomości systemu operacyjnego nie sądzę, aby to było ważne. Może wyraźnie określ system operacyjny, o którym mówisz.
Brian R. Bondy

1
Uwaga: norma nic na ten temat nie mówi. Nie jest to również gwarantowane. W ten sposób działa na większości, jeśli nie na wszystkich, nowoczesnych systemach operacyjnych, ale nie muszą, a w przeszłości były takie, które były powszechne i nie wykonywały tego czyszczenia.
Edward Strange

5
Istnieją różne systemy operacyjne czasu rzeczywistego dla małych urządzeń i tak dalej, które nie odzyskują pamięci utraconej w wyniku wycieków. Twoje pytanie zależy od systemu operacyjnego, o którym mówisz.
Brian Neal

14
Nawet w przypadku określonych systemów operacyjnych chronionych pamięcią nadal musisz zdefiniować „wyciek”. Aplikacje mogą alokować zasoby „systemowe” poza ich własną przestrzenią pamięci (uchwyty są często używane do ich identyfikacji w świecie Windows). Zamknięcie aplikacji nie zawsze zapewnia zwolnienie tego typu zasobów.
David

34

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.


14

Czy pracujesz na komputerze z systemem operacyjnym (Windows, Linux itp.)? Jeśli tak, to tak, generalnie system zwalnia pamięć związaną z programem po jego zakończeniu.


10

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 ...)


5

O ile wiem, nowoczesny system operacyjny zwolni tę pamięć po zakończeniu działania programu.


4

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.


6
Część pamięci nie może zostać odzyskana przez system operacyjny - na przykład co?

2
W niektórych systemach operacyjnych czasu rzeczywistego widziałem specjalne bloki bufora Ethernet, które nie są czyszczone po zakończeniu procesu.
Brian Neal

1
Pamięć współdzielona również nie jest zwykle odzyskiwana, ponieważ możesz chcieć, aby została zachowana na potrzeby użycia procesów przejściowych.
Brian Neal
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.