Наоборот, вы всегда должны отдавать предпочтение выделению стека, если вы не хотите, чтобы в вашем пользовательском коде было новое / удаление.
Как вы говорите, когда переменная объявлена в стеке, ее деструктор автоматически вызывается, когда она выходит из области видимости, что является вашим основным инструментом для отслеживания времени жизни ресурса и предотвращения утечек.
Таким образом, в общем, каждый раз, когда вам нужно выделить ресурс, будь то память (путем вызова new), файловые дескрипторы, сокеты или что-то еще, оберните его в класс, где конструктор получает ресурс, а деструктор освобождает его , Затем вы можете создать объект этого типа в стеке, и вы гарантированно освободите свой ресурс, когда он выйдет из области видимости. Таким образом, вам не нужно везде отслеживать новые / удаляемые пары, чтобы избежать утечек памяти.
Наиболее распространенное название для этой идиомы: RAII
Также обратите внимание на классы интеллектуальных указателей, которые используются для оборачивания результирующих указателей в тех редких случаях, когда вам нужно выделить что-то новое за пределами выделенного объекта RAII. Вместо этого вы передаете указатель интеллектуальному указателю, который затем отслеживает его время жизни, например, путем подсчета ссылок, и вызывает деструктор, когда последняя ссылка выходит из области видимости. Стандартная библиотека имеет std::unique_ptr
для простого управления на основе области и std::shared_ptr
, который выполняет подсчет ссылок для реализации совместного владения.
Многие учебники демонстрируют объект
создание экземпляра с использованием фрагмента, например ...
Итак, вы обнаружили, что большинство уроков - отстой. ;)
В большинстве уроков вы узнаете о паршивых практиках C ++, в том числе о вызове new / delete для создания переменных, когда в этом нет необходимости, и о том, как трудно отслеживать время жизни ваших выделений.