Cykl życia obiektu
Dowiedz się, kiedy obiekty są tworzone i niszczone
Cykl życia obiektu to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C++ Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C++ Academy zawiera 4 lekcji w sumie.
Kiedy powstają obiekty
Czas życia obiektu rozpoczyna się po zaalokowaniu dla niego pamięci i zakończeniu jego konstruktora. Od tego momentu obiekt jest w pełni użyteczny.
#include <iostream>
struct Widget {
Widget() { std::cout << "born\n"; }
};
int main() {
Widget w; // constructor runs here
}Kiedy obiekty umierają
Czas życia kończy się w chwili wykonania destruktora. W przypadku obiektu stosu następuje to przy zamykającej klamrze jego zakresu.
#include <iostream>
struct Widget {
~Widget() { std::cout << "dies\n"; }
};
int main() {
Widget w;
std::cout << "alive\n";
} // ~Widget runs hereKolejność konstrukcji i destrukcji
Obiekty są niszczone w odwrotnej kolejności do kolejności ich konstruowania. Ostatni utworzony obiekt jest niszczony jako pierwszy.
#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
}Automatyczny czas życia obiektów na stosie
Obiekty automatyczne żyją przez czas trwania otaczającego ich bloku. Jest to najczęstszy i najbezpieczniejszy model czasu życia.
Dynamiczny czas życia obiektów na stercie
Obiekty na stercie utworzone za pomocą new żyją do chwili wywołania delete — ich czas życia zależy od Ciebie, a nie od zakresu.
#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
}Czas życia statycznego obiektu
Obiekty o statycznym czasie przechowywania żyją przez cały czas działania programu. Statyczny obiekt lokalny funkcji jest konstruowany raz, przy pierwszym użyciu.
#include <iostream>
int next() {
static int counter = 0; // built once
return ++counter;
}
int main() {
std::cout << next() << next() << next() << "\n";
}Obiekty tymczasowe
Obiekt tymczasowy utworzony w wyrażeniu zwykle umiera na końcu całego wyrażenia (przy średniku).
#include <iostream>
#include <string>
int main() {
std::cout << (std::string("a") + "b") << "\n";
} // temporary string dies after this lineElementy są konstruowane przed ciałem
Obiekty składowe klasy są konstruowane przed wykonaniem ciała konstruktora obiektu zawierającego klasę i niszczone po wykonaniu ciała jej destruktora.
#include <iostream>
#include <string>
struct Engine { Engine() { std::cout << "engine\n"; } };
struct Car {
Engine e;
Car() { std::cout << "car\n"; }
};
int main() { Car c; }Wydłużenie czasu życia przez referencję const
Powiązanie obiektu tymczasowego z const& wydłuża jego czas życia tak, aby odpowiadał czasowi życia referencji — to przydatna reguła języka C++.
#include <iostream>
#include <string>
int main() {
const std::string& s = std::string("hi");
std::cout << s << "\n"; // s still valid
}Użycie po zakończeniu czasu życia
Odwołanie się do obiektu po zakończeniu jego czasu życia prowadzi do niezdefiniowanego działania — to klasyczny błąd zwisającej referencji lub użycia po zwolnieniu.
Czas życia jest podstawą RAII
Ponieważ destruktory są uruchamiane deterministycznie na końcu czasu życia, C++ wiąże zwalnianie zasobów z czasem życia — to podstawa RAII, omówiona w następnym kursie.
Szybki test
Sprawdź swoją wiedzę na temat czasu życia obiektów.
Podsumowanie
Nauczyłeś się, że czas życia obiektu rozpoczyna się po jego skonstruowaniu i kończy wraz z jego zniszczeniem. Obiekty automatyczne podlegają zakresowi, obiekty dynamiczne — parze new/delete, a obiekty statyczne istnieją przez cały czas działania programu. Niszczenie odbywa się w odwrotnej kolejności — to podstawa RAII.
Często zadawane pytania
Czy lekcja „Cykl życia obiektu” jest bezpłatna?
Tak — pełny tekst „Cykl życia obiektu” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C++ Academy, przejdź na CoddyKit PRO. Kurs C++ Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Cykl życia obiektu”?
Dowiedz się, kiedy obiekty są tworzone i niszczone Ćwiczysz C++ Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć C++ Academy?
Nie wymagamy żadnego doświadczenia. C++ Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Cykl życia obiektu”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji C++ Academy?
Tak. Każda lekcja C++ Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Alokacja na stosie
- Alokacja na stercie z new/delete
- Cykl życia obiektu
- Typowe błędy pamięci