Operatory new, delete -wycieki pamięci

Odpowiedz Nowy wątek
2019-08-29 20:57
0

Pytanko z teorii. Przeglądając przykłady z alokowaniem zmiennej np klasy na stercie operatorem new czyta się
że ważnym jest by zwolnić później pamięć operatorem delete by nie było wycieku pamięci.
Często operator taki jest ustawiony pod koniec programu. No i to mnie zastanawia bo przecież jeżeli program kończy działanie to rozumiem że uwalnia on miejsce na stercie samoistnie. No chyba że jest inaczej?

Pozostało 580 znaków

2019-08-29 20:59
kq
7

Kończenie pracy programu zwalnia pamięć na wszystkich systemach z separacją procesów. W przypadku programów które działają w zamierzeniu krótko (np. kiedyś gcc) z założenia nie zwalniano pamięci, bo miał się tym zajmowac system (przywoływano nawet analogię, że nie spuszcza się wody w toalecie jeśli chwilę później zrównujesz pomieszczenie z ziemią).

Ale jeśli chodzi o generalne rady: https://dsp.krzaq.cc/post/176[...]cxx-kiedy-uzywac-new-i-delete


edytowany 1x, ostatnio: kq, 2019-08-29 21:04
"analogię, że spuszcza się wody" chyba zjadło "nie". - szweszwe 2019-08-29 21:03
Owszem, dziękuję - kq 2019-08-29 21:04

Pozostało 580 znaków

2019-09-01 19:34
0

Trochę poza tematem ale warto pamiętać, że delete operator jest czymś innym niż operator delete. delete operator przed zwolnieniem pamięci wywoła destruktor i odpali overload resolution dla operator delete, który zwolni pamięć (chyba, że dopasowane przeładowanie akurat nie zwalnia pamięci bo np. jest no-op - liniowy alokator czy coś). Generalnie chodzi o to, że leak pamięci to jedno, a leak resource (bo brak wywołania destruktora) to drugie.

Może za dużo piwa dzisiaj łyknąłem, ale mógłbyś podać przykład? - tajny_agent 2019-09-01 23:07

Pozostało 580 znaków

2019-09-01 23:08
0

Wszystkie zasoby są zwalniane przy zakończeniu procesu. Nie tylko pamięć RAM, ale też pliki, gniazda, urządzenia, itd Dla przykładu jak leci SIGKILL to program zwalnia wszystkie zasoby mimo, że nie uruchamia żadnych destruktorów, nawet jeśli takowe są zaimplementowane.

Osobną kwestią od zwalniania zasobów jest np usuwanie plików tymczasowych. Jeśli to jest zaimplementowane w destruktorach to bez odpalenia ich pliki tymczasowe nie zostaną usunięte. Jednak na Linuksie wszystko w /tmp i tak jest domyślnie czyszczone przy restarcie, więc w takim przypadku i tak często dużego problemu nie ma.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 1x, ostatnio: Wibowit, 2019-09-01 23:11

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0