Навпаки, завжди слід віддавати перевагу розподілу стеків, якщо ви, як правило, ніколи не повинні мати нові / видаляти у своєму коді користувача.
Як ви кажете, коли змінна оголошена в стеку, її деструктор автоматично викликається, коли вона виходить за рамки, що є вашим головним інструментом для відстеження терміну служби ресурсу та уникнення витоків.
Тож загалом, кожного разу, коли потрібно виділяти ресурс, будь то пам'ять (виклик нового), ручки файлів, сокети або щось інше, загортайте його в клас, де конструктор отримує ресурс, а деструктор випускає його. Тоді ви можете створити об’єкт цього типу на стеці, і ви гарантуєтеся, що ваш ресурс буде звільнений, коли він вийде за межі області. Таким чином, вам не доведеться скрізь відслідковувати ваші нові / видаляти пари, щоб уникнути витоку пам'яті.
Найпоширеніша назва цієї ідіоми - RAII
Також розгляньте класи класів розумних покажчиків, які використовуються для обгортання отриманих покажчиків на рідкісні випадки, коли вам потрібно виділити щось нове поза виділеним об’єктом RAII. Ви натомість передаєте вказівник розумному вказівнику, який потім відстежує його термін служби, наприклад, шляхом підрахунку посилань, і викликає деструктора, коли остання посилання виходить за межі області. Стандартна бібліотека має std::unique_ptr
просте управління, засноване на масштабах, і std::shared_ptr
що робить підрахунок посилань для реалізації спільної власності.
Багато навчальних посібників демонструють інстанціювання об'єкта за допомогою фрагмента, наприклад ...
Отже, ви виявили, що більшість навчальних посібників смоктають. ;) Більшість навчальних посібників навчають вас манірних практик C ++, включаючи виклик нових / видалення для створення змінних, коли це не потрібно, та важко відстежуючи термін експлуатації ваших виділень.