0Pricing
C++ Academy · Lekcja

Destruktory i sprzątanie

Automatycznie zwalniaj zasoby

Destruktory i sprzątanie to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 2 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.

Działanie destruktora

Destruktor jest wykonywany, gdy kończy się czas życia obiektu. Jego zadaniem jest zwolnienie wszystkiego, co posiada obiekt. Jego nazwa ma postać ~ClassName.

#include <iostream>

class File {
public:
    ~File() { std::cout << "closing file\n"; }
};

int main() {
    File f;
}   // ~File runs here

Zwalnianie posiadanej pamięci

Jeśli klasa posiada pamięć na stercie, jej destruktor musi ją zwolnić. To klasyczne miejsce na wywołanie delete.

#include <iostream>

class Buffer {
    int* data;
public:
    Buffer(int n) : data(new int[n]) {}
    ~Buffer() { delete[] data; }   // cleanup
};

int main() { Buffer b(10); }

Destruktory są wykonywane automatycznie

Nie wywołuje się samodzielnie destruktorów obiektów na stosie — kompilator wstawia takie wywołanie na końcu zakresu.

Odwrotna kolejność elementów

Obiekty składowe są niszczone w odwrotnej kolejności do tej, w której zostały zadeklarowane, po wykonaniu ciała destruktora.

#include <iostream>

struct A { ~A() { std::cout << "~A\n"; } };
struct B { ~B() { std::cout << "~B\n"; } };
struct C {
    A a;
    B b;          // destroyed before a
    ~C() { std::cout << "~C\n"; }
};

int main() { C c; }

Wirtualne destruktory

Jeśli usuwasz obiekt klasy pochodnej za pomocą wskaźnika do klasy bazowej, destruktor klasy bazowej musi być oznaczony jako virtual — w przeciwnym razie część klasy pochodnej nie zostanie zwolniona.

#include <iostream>

struct Base {
    virtual ~Base() { std::cout << "~Base\n"; }
};
struct Derived : Base {
    ~Derived() override { std::cout << "~Derived\n"; }
};

int main() {
    Base* p = new Derived();
    delete p;   // both run thanks to virtual
}

Destruktory nie powinny zgłaszać wyjątków

Zgłoszenie wyjątku z destruktora podczas odwijania stosu kończy działanie programu. Destruktory powinny być (niejawnie) oznaczone jako noexcept i nigdy nie powinny przepuszczać wyjątków na zewnątrz.

Domyślny destruktor

Jeśli nie zdefiniujesz własnego destruktora, kompilator wygeneruje destruktor niszczący każdy element składowy. W przypadku klas zawierających wyłącznie elementy RAII jest to dokładnie właściwe rozwiązanie.

#include <string>
#include <vector>

struct Record {
    std::string name;          // self-cleaning
    std::vector<int> values;   // self-cleaning
};   // default destructor is enough

Destruktor = default

Zapisz ~Class() = default;, aby jawnie zażądać destruktora wygenerowanego przez kompilator — jest to przydatne, gdy potrzebujesz wirtualnego destruktora, ale nie potrzebujesz własnej logiki.

#include <iostream>

struct Shape {
    virtual ~Shape() = default;   // virtual + default
};

Zwalnianie zasobów innych niż pamięć

Destruktory zamykają również pliki, zwalniają blokady i rozłączają gniazda — nie tylko zwalniają pamięć. Każdy pozyskany zasób należy obsłużyć w destruktorze.

Kolejność między obiektami

Wiele zmiennych lokalnych jest niszczonych w odwrotnej kolejności do kolejności ich konstruowania, dlatego destruktor może bezpiecznie używać obiektów utworzonych przed nim.

Pozwól elementom RAII wykonać pracę

Jeśli każdy element składowy ma typ RAII, często nie potrzebujesz żadnego własnego destruktora. Własnoręcznie pisane destruktory zachowaj dla zasobów zarządzanych ręcznie.

Szybki test

Sprawdź swoją wiedzę na temat destruktorów.

Podsumowanie

Nauczyłeś się, że destruktory automatycznie zwalniają posiadane zasoby na końcu czasu życia, niszczą elementy w odwrotnej kolejności deklaracji, nie mogą zgłaszać wyjątków i muszą być oznaczone jako virtual w polimorficznych klasach bazowych. Elementy RAII często sprawiają, że własne destruktory są niepotrzebne.

Często zadawane pytania

Czy lekcja „Destruktory i sprzątanie” jest bezpłatna?

Tak — pełny tekst „Destruktory i sprzątanie” 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 „Destruktory i sprzątanie”?

Automatycznie zwalniaj zasoby Ć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 2 z 4.

Ile czasu zajmuje lekcja „Destruktory i sprzątanie”?

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

  1. Zasada RAII
  2. Destruktory i sprzątanie
  3. Reguła trzech/pięciu
  4. Strażnicy zakresu
← Powrót do C++ Academy