Czyszczenie free store

Czyszczenie free store
pingwindyktator
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Kraków
  • Postów:1055
0

Z tego, co słyszałem, należy zawsze obiekty powołane operatorem new / new[] usuwać. Dlaczego jest to dobre rozwiązanie nawet wtedy, kiedy delete / delete[] ma wystąpic zaraz przed zamknięciem programu?

Kopiuj
int main()
{
  [...]
  delete[] T;
  return 0;
}

do not code, write prose
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 dni
0

Bo zaraz (po tym jak już zapomnisz że tego nie zrobiłeś) przyjdzie ci do głowy zapętlić to co masz przed return 0.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
pingwindyktator
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Kraków
  • Postów:1055
0

I tylko tyle? Czyli kiedy nie przyjdzie mi nic takiego do głowy, to nie musze tego czyscic?


do not code, write prose
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 dni
0

Nigdy nie wiesz kiedy.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
pingwindyktator
Nie rozumiem, co masz na myśli.
_13th_Dragon
No bo coś sobie napiszesz, później za pół roku przy okazji innego projektu przypomnisz sobie że miałeś taki pasujący fajny fragment, skopiujesz sobie a tu ... wycieki.
pingwindyktator
A jeśli nie skopiuje? Jeśli nie bedzie tam tej petli i już?
_13th_Dragon
Czy słyszałeś o ubezpieczeniach AC/OC/na życie itp? Po co ci takie coś? A jeżeli nikogo nie potrącisz? A jeżeli nigdy ci cegła na głowę nie spadnie? A jeżeli ... ? To się robi właśnie na wypadek jeżeli jednak przypadkiem się stanie.
pingwindyktator
Rozumiem, jednak przyznasz, że istnieje możliwosc napisania tego bez pętli i koniec kropka. Nie zastanawiajmy sie nad sensem tego. Moje pytanie nie jest skomplikowane, wiec sugerowałbym tego nie zmieniać i nie wróżyć, że wykorzystam ten kod w przyszlosci.
szopenfx
  • Rejestracja:prawie 21 lat
  • Ostatnio:5 miesięcy
1

Jeśli do każdego przydzielenia pamięci nie dopasujesz sobie od razu zwolnienia to znaczy, że nie panujesz nad swoim kodem. Czyli albo z niechlujności nie zwolnisz pamięci przed wyjściem z programu albo z niewiedzy gdzie powinieneś to zrobić. Jeśli w pewnym momencie zechcesz użyć narzędzia do sprawdzenia wycieków (nie wiem jak w C++ ale w Delphi np. FastMM) to oprócz wycieku, którego się spodziewałeś dostaniesz informację o pozostałych zagubionych blokach i jeśli na bieżąco nie będziesz ich sprawdzał z czasem będzie ci trudniej je odróżnić.
Kolejna sprawa to to, że w main zazwyczaj niczego się nie alokuje i nie zwalnia to raczej takie przykłady "na nauczyciela" w prawdziwym życiu byłoby to gdzieś zaszyte w destruktorze a ile obiektów takiej klasy utworzy użytkownik i jak - tego nie wiesz. Z niewinnych zagubionych kilku kilo robią się później megabajty.

_13th_Dragon
Tylko z jednym fragmentem nie do końca się zgadzam, a mianowicie z ostatnim zdaniem, bo z zagubionych 4-ch bajtów - czasami gigabajty się robią.
0

Ręczne zwalnianie pamięci na końcu maina też nie jest dobrym rozwiązaniem. Jeśli trakcie poleci nieobsłużony wyjątek, to delete nie zostanie zawołane z wszystkimi wspomnianymi wcześniej konsekwencjami.
Przy zmienianiu programu, też nie wygodnie pamiętać konieczności dokonania modyfikacji w dwóch miejscach, zwłaszcza jeśli uznamy, że tą niepotrzebną/nadmiarową końcówkę ze zwalnianiem poprawimy jak już reszta zacznie działać:)

Typowo do trzymania obiektów na stercie lepiej używać inteligentnych wskaźników, a do obsługi tablic o nieznanej z góry wielkości std::vector.

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.