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