Wręcz przeciwnie, zawsze powinieneś preferować alokacje stosu, do tego stopnia, że z reguły nigdy nie powinieneś mieć nowego / usuwania w kodzie użytkownika.
Jak powiedziałeś, kiedy zmienna jest zadeklarowana na stosie, jej destruktor jest wywoływany automatycznie, gdy wyjdzie poza zakres, co jest głównym narzędziem do śledzenia czasu życia zasobów i unikania wycieków.
Ogólnie rzecz biorąc, za każdym razem, gdy musisz przydzielić zasób, niezależnie od tego, czy jest to pamięć (przez wywołanie new), uchwyty plików, gniazda czy cokolwiek innego, opakuj go w klasę, w której konstruktor pozyskuje zasób, a destruktor zwalnia go. Następnie możesz utworzyć obiekt tego typu na stosie i masz gwarancję, że Twój zasób zostanie zwolniony, gdy wyjdzie poza zakres. W ten sposób nie musisz wszędzie śledzić nowych / usuwanych par, aby uniknąć wycieków pamięci.
Najpopularniejszą nazwą tego idiomu jest RAII
Przyjrzyj się także klasom inteligentnych wskaźników, które są używane do zawijania wynikowych wskaźników w rzadkich przypadkach, gdy musisz przydzielić coś nowym poza dedykowanym obiektem RAII. Zamiast tego przekazujesz wskaźnik do inteligentnego wskaźnika, który następnie śledzi jego czas życia, na przykład przez zliczanie odwołań, i wywołuje destruktor, gdy ostatnie odwołanie wykracza poza zakres. Biblioteka standardowa std::unique_ptr
umożliwia proste zarządzanie w oparciu o zakres i std::shared_ptr
zliczanie odniesień w celu wdrożenia współwłasności.
Wiele samouczków demonstruje tworzenie instancji obiektu za pomocą fragmentu kodu, takiego jak ...
Odkryłeś więc, że większość samouczków jest do niczego. ;) Większość samouczków uczy cię kiepskich praktyk C ++, w tym wywoływania new / delete w celu tworzenia zmiennych, gdy nie jest to konieczne, i utrudnia śledzenie czasu życia przydziałów.