Ответ
В C++ память для локальных переменных (объявленных внутри функции или блока) выделяется на стеке (stack). Это автоматическое и быстрое выделение. Память в куче (heap) выделяется динамически, по запросу программиста, с помощью операторов new/delete или функций malloc()/free().
Ключевые различия:
| Характеристика | Стек (Stack) | Куча (Heap) |
|---|---|---|
| Выделение | Автоматическое, при входе в область видимости. | Ручное, через new/malloc. |
| Освобождение | Автоматическое, при выходе из области видимости. | Ручное, через delete/free. |
| Скорость | Очень высокая (просто сдвиг указателя стека). | Относительно медленная (поиск свободного блока). |
| Размер | Ограничен (обычно 1-8 МБ). | Ограничен только объемом ОЗУ. |
| Фрагментация | Нет. | Возможна. |
| Управление | Компилятор. | Программист (или умные указатели). |
Пример:
void exampleFunction() {
int onStack = 42; // Переменная 'onStack' живет на стеке.
int* onHeap = new int(100); // Память для int выделена в куче.
// Указатель 'onHeap' сам живет на стеке.
// ... использование ...
delete onHeap; // КРИТИЧНО: память в куче нужно освободить вручную.
} // Здесь переменная 'onStack' и указатель 'onHeap' автоматически уничтожаются.
Современная практика: Для динамической памяти в C++ предпочтительно использовать умные указатели (std::unique_ptr), которые обеспечивают автоматическое освобождение ресурсов (RAII).