Operatory new, delete -wycieki pamięci

Operatory new, delete -wycieki pamięci
Rafal Kowal
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 5 lat
  • Postów:3
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?

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:4 dni
  • Lokalizacja:Szczecin
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/ucze-sie-cxx-kiedy-uzywac-new-i-delete


edytowany 1x, ostatnio: kq
szweszwe
"analogię, że spuszcza się wody" chyba zjadło "nie".
kq
Owszem, dziękuję
satirev
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 4 lata
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.

tajny_agent
Może za dużo piwa dzisiaj łyknąłem, ale mógłbyś podać przykład?
Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:3 minuty
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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.