Czyszczenie free store

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?

int main()
{
  [...]
  delete[] T;
  return 0;
}
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.

0

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

0

Nigdy nie wiesz kiedy.

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.

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.

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