Выделение в стеке
Разберитесь с работой автоматического хранилища
«Выделение в стеке» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Выделение в стеке
- Выделение в куче с new/delete
- Время жизни объектов
- Распространённые ошибки работы с памятью