0Pricing
C++ Academy · Урок

Время жизни объектов

Разберитесь, когда объекты создаются и уничтожаются

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

Когда объекты создаются

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

#include <iostream>

struct Widget {
    Widget() { std::cout << "born\n"; }
};

int main() {
    Widget w;   // constructor runs here
}

Когда объекты уничтожаются

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

#include <iostream>

struct Widget {
    ~Widget() { std::cout << "dies\n"; }
};

int main() {
    Widget w;
    std::cout << "alive\n";
}   // ~Widget runs here

Порядок создания и уничтожения

Объекты уничтожаются в обратном порядке создания. Последний созданный объект уничтожается первым.

#include <iostream>

struct Tag {
    int id;
    Tag(int i) : id(i) { std::cout << "make " << id << "\n"; }
    ~Tag() { std::cout << "drop " << id << "\n"; }
};

int main() {
    Tag a(1);
    Tag b(2);   // dropped before a
}

Автоматический срок жизни в стеке

Автоматические объекты существуют в течение всего времени жизни содержащего их блока. Это самая распространённая и безопасная модель управления сроком жизни.

Динамический срок жизни в куче

Объекты в куче, созданные с помощью new, существуют до вызова delete — их сроком жизни управляете Вы, а не область видимости.

#include <iostream>

struct Widget {
    ~Widget() { std::cout << "dies\n"; }
};

int main() {
    Widget* w = new Widget();
    std::cout << "still alive\n";
    delete w;   // destructor runs here
}

Статический срок жизни

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

#include <iostream>

int next() {
    static int counter = 0;   // built once
    return ++counter;
}

int main() {
    std::cout << next() << next() << next() << "\n";
}

Временные объекты

Временный объект, созданный в выражении, обычно уничтожается в конце полного выражения (у точки с запятой).

#include <iostream>
#include <string>

int main() {
    std::cout << (std::string("a") + "b") << "\n";
}   // temporary string dies after this line

Поля создаются до выполнения тела

Объекты-поля класса создаются до выполнения тела конструктора содержащего их объекта и уничтожаются после выполнения тела его деструктора.

#include <iostream>
#include <string>

struct Engine { Engine() { std::cout << "engine\n"; } };
struct Car {
    Engine e;
    Car() { std::cout << "car\n"; }
};

int main() { Car c; }

Продление срока жизни константной ссылкой

Привязка временного объекта к const& продлевает его срок жизни до срока жизни ссылки — это удобное правило C++.

#include <iostream>
#include <string>

int main() {
    const std::string& s = std::string("hi");
    std::cout << s << "\n";   // s still valid
}

Обращение после окончания срока жизни

Обращение к объекту после окончания его срока жизни приводит к неопределённому поведению — это классическая ошибка висячей ссылки или обращения после освобождения.

Срок жизни лежит в основе RAII

Поскольку деструкторы детерминированно выполняются в конце срока жизни, C++ связывает очистку ресурсов со сроком жизни — это основа RAII, который рассматривается в следующем курсе.

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

Проверьте, насколько хорошо Вы поняли срок жизни объектов.

Итоги

Вы узнали, что срок жизни объекта начинается после его создания и заканчивается при уничтожении. Автоматические объекты следуют области видимости, динамические объекты — паре new/delete, а статические существуют в течение всей работы программы. Уничтожение происходит в обратном порядке — это основа RAII.

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

Урок «Время жизни объектов» бесплатный?

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

Чему я научусь в уроке «Время жизни объектов»?

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

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

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

Сколько времени занимает урок «Время жизни объектов»?

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

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

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

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

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