0Pricing
C++ Academy · Урок

Выделение в стеке

Разберитесь с работой автоматического хранилища

«Выделение в стеке» — бесплатный урок C++ Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.

Автоматическая память

Локальные переменные хранятся в автоматической памяти, которую обычно называют стеком. Они создаются при входе выполнения в их область видимости и уничтожаются при выходе из неё.

#include <iostream>

int main() {
    int x = 42;          // on the stack
    double pi = 3.14;    // on the stack
    std::cout << x << " " << pi << "\n";
}

Стек растёт и сокращается

Каждый вызов функции помещает в стек кадр стека, содержащий её локальные переменные. При возврате из функции кадр извлекается, а локальные переменные исчезают — ручная очистка не требуется.

#include <iostream>

void greet() {
    int local = 7;          // pushed on call
    std::cout << local << "\n";
}                            // popped on return

int main() { greet(); }

Порядок LIFO

Стек работает по принципу последним вошёл — первым вышел. Последняя созданная локальная переменная первой уничтожается при завершении области видимости.

#include <iostream>

int main() {
    int a = 1;
    {
        int b = 2;   // created after a
        std::cout << b << "\n";
    }                // b destroyed first
    std::cout << a << "\n";
}

Быстро и дёшево

Выделение памяти в стеке чрезвычайно быстро: оно лишь перемещает указатель стека. Не требуется искать свободную память или вести служебный учёт, как это необходимо для кучи.

Область видимости определяет время жизни

Объект в стеке существует только внутри блока, в котором он объявлен. Вложенные блоки имеют собственные области видимости.

#include <iostream>

int main() {
    for (int i = 0; i < 3; ++i) {
        int square = i * i;   // recreated each iteration
        std::cout << square << "\n";
    }
}

Ограниченный размер

Стек имеет фиксированный ограниченный размер (часто несколько мегабайт). Выделение огромных массивов в стеке может привести к сбою из-за переполнения стека.

// Risky: a large fixed array on the stack
int big[1000000];   // may overflow the stack

Возврат адреса стека — ошибка

Никогда не возвращайте указатель или ссылку на локальную переменную. После возврата из функции эта память исчезает, и указатель становится висячим.

int* bad() {
    int local = 5;
    return &local;   // BUG: local dies here
}

Передача больших объектов по ссылке

Копирование больших объектов в стек неэффективно. Передавайте их с помощью const&, чтобы избежать копирования и сохранить небольшое потребление памяти стека.

#include <string>

void print(const std::string& s) {  // no copy
    // use s
}

Для объектов в стеке не требуется удаление

Поскольку компилятор автоматически управляет сроком их жизни, Вы должны никогда не вызывать delete для переменной в стеке.

#include <iostream>

int main() {
    int n = 10;
    // delete &n;   // ERROR: not heap-allocated
    std::cout << n << "\n";
}

Массивы в стеке

Массивы фиксированного размера с известной длиной хранятся в стеке и автоматически освобождаются при завершении области видимости.

#include <iostream>

int main() {
    int values[3] = {10, 20, 30};
    for (int v : values) std::cout << v << "\n";
}

Когда следует выбирать стек

Выбирайте стек для небольших объектов с коротким сроком жизни, размер которых известен во время компиляции. Это быстрее и не требует ручной очистки — обращайтесь к куче только при действительной необходимости.

Быстрая проверка

Проверьте, насколько хорошо Вы поняли выделение памяти в стеке.

Итоги

Вы узнали, что выделение памяти в стеке использует автоматическое хранилище, связанное с областью видимости: переменные создаются при входе и уничтожаются при выходе в порядке LIFO. Это быстро, не требует ручной очистки и имеет ограниченный размер. Никогда не возвращайте адреса локальных переменных и никогда не применяйте delete к объектам в стеке.

Часто задаваемые вопросы

Урок «Выделение в стеке» бесплатный?

Да — полный текст урока «Выделение в стеке» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.

Чему я научусь в уроке «Выделение в стеке»?

Разберитесь с работой автоматического хранилища Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C++ Academy?

Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Выделение в стеке»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C++ Academy?

Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Выделение в стеке
  2. Выделение в куче с new/delete
  3. Время жизни объектов
  4. Распространённые ошибки работы с памятью
← Назад к C++ Academy