C ++ имеет два основных типа памяти, где размещаются объекты: стек и свободное хранилище (куча). Объекты в стеке выделяются и освобождаются вручную, и они включают в себя параметры функции, автоматические (локальные) переменные, временные объекты, возвращаемые значения. Объекты в бесплатном хранилище (куче) вместо этого управляются явно с new
, new[]
, delete
и delete[]
. Вы также можете управлять необработанной памятью из бесплатного хранилища, используя malloc
/ free
или используя причудливые именованные функции operator new
и operator delete
и их []
аналоги.
Для объектов, управляемых в бесплатном хранилище на C ++, программист обязан позаботиться о распределении и освобождении ... в других языках это вместо этого автоматическое.
В C ++ также необходимо обратить внимание на то, что время жизни стековых объектов связано с областью действия (и, например, хранение или возврат адреса локальной переменной является распространенной ошибкой или множеством ошибок), хотя это также не проблема на других языках.
Основной причиной этого усложнения является скорость: использование логики распределения на основе стека происходит намного быстрее, чем использование свободного хранилища (для текущих процессоров, для выделения многих переменных в стеке просто требуется одно сложение, а для освобождения их - просто вычитание).
С другими языками компилятор анализирует код и решает, где можно использовать выделение стека, а где нет, вместо этого в C ++ это работа для программиста.
Обратите внимание, что в C ++ управление памятью на самом деле немного более замысловатое, чем это объяснение (например, есть также память, в которой хранятся объекты исключений, могут быть настраиваемые распределители для классов и параметр распределителя для контейнеров), но программисту редко нужно это учитывать.