Operatory new, delete -wycieki pamięci

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?

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

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.

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.

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