Откуда выделяется память для локальных переменных (на стеке или в куче)?

«Откуда выделяется память для локальных переменных (на стеке или в куче)?» — вопрос из категории Other, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В 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).