Menu
Coddy logo textTech

Стек и куча

Часть раздела Объектно-ориентированное программирование путешествия по C++ на Coddy. Урок 12 из 104.

Программы на C++ используют две основные области памяти: стек и heap. Понимание того, где находятся ваши объекты, имеет решающее значение для написания эффективного кода без ошибок.

Стек — это быстрая автоматическая память. Переменные, объявленные внутри функций, хранятся здесь и автоматически уничтожаются, когда выходят из области видимости.

void example() {
    int x = 10;           // Выделение в стеке
    Player player;        // Выделение в стеке — уничтожается автоматически
}   // x и player уничтожаются здесь

heap — это более крупная, но медленная memory, которой ты управляешь вручную. Объекты в heap сохраняются, пока ты явно не выполнишь delete их.

void example() {
    Player* player = new Player();  // Выделение в куче
    // player существует до удаления
    delete player;                   // Требуется ручная очистка
}

Ключевые различия:

StackHeap
Быстрое выделениеБолее медленное выделение
Ограниченный размерБольшая ёмкость
Автоматическая очисткаТребуется Manual cleanup
Объекты фиксированного размераОбъекты динамического размера

Используйте выделение памяти в стеке для небольших объектов с коротким временем жизни. Используйте выделение памяти в куче, когда объекты должны пережить свою область видимости или когда их размер определяется во время выполнения.

Забывание удалить память в куче вызывает утечки памяти — распространённый источник ошибок в программах на C++.

challenge icon

Задание

Легко

Давайте исследуем разницу между стековой и кучевой памятью, создав простой класс Counter, который отслеживает, как объекты создаются и уничтожаются.

Вы создадите два файла, чтобы организовать свой код:

  • Counter.h: define класс Counter с атрибутом name private (строка). Включите constructor, который принимает имя и выводит "Creating: <name>", а также destructor, который выводит "Destroying: <name>". Добавьте method getName(), возвращающий имя счётчика.
  • main.cpp: продемонстрируйте выделение памяти как в стеке, так и в куче. Прочитайте имя из input, затем:
    • Create размещённый в стеке Counter, используя это имя
    • Create размещённый в куче Counter с именем "HeapCounter"
    • Выведите оба имени счётчиков в формате "Stack: <name>" и "Heap: <name>"
    • Delete размещённый в куче счётчик, чтобы prevent утечку memory

Обратите внимание, как сообщения constructor и destructor появляются в разном порядке в зависимости от того, когда вы создаёте и удаляете каждый объект. Объект в стеке будет automatically уничтожен, когда завершится main(), тогда как объект в куче необходимо удалить явно.

Подключите header-файл в main.cpp, используя #include "Counter.h".

Попробуйте сами

#include <iostream>
#include <string>
#include "Counter.h"

using namespace std;

int main() {
    // Прочитать имя из ввода
    string inputName;
    cin >> inputName;

    // TODO: Создать выделенный в стеке Counter, используя inputName

    // TODO: Создать выделенный в куче Counter с именем "HeapCounter"

    // TODO: Print stack counter name in format "Stack: <name>"

    // TODO: Вывести имя счётчика в куче в формате "Heap: <name>"

    // TODO: Удалить выделенный в куче счётчик, чтобы предотвратить утечку памяти

    return 0;
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор C++