KWALIFIKACJA INF2 + INF3 - CZERWIEC 2006

PYTANIE NR 8.
Destruktor w języku C++ to metoda
A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
Destruktor to specjalna funkcja składowa klasy w C++, która uruchamia się, gdy obiekt kończy swoje życie (np. przy wyjściu z zakresu lub po delete). Jego zadaniem jest wykonanie operacji końcowych, typowo zwolnienie zasobów należących do obiektu, ale nie jest to "sprzątanie całej pamięci operacyjnej".

Pełne wyjaśnienie:

W C++ destruktor jest specjalną funkcją składową klasy, wywoływaną automatycznie w momencie niszczenia obiektu. Do zniszczenia może dojść m.in. wtedy, gdy obiekt lokalny wychodzi poza swój zakres (koniec bloku/funkcji), gdy usuwamy obiekt utworzony dynamicznie przez delete, albo gdy niszczone są obiekty składowe i globalne przy zakończeniu programu.

Odpowiedź "wywoływana w momencie usuwania obiektu" jest poprawna, bo opisuje właśnie moment uruchomienia destruktora: koniec życia obiektu. To jest kluczowa cecha odróżniająca destruktor od konstruktora.

Dlaczego pozostałe odpowiedzi są błędne lub mylące?

  • "wywoływana w momencie tworzenia obiektu" opisuje konstruktor, a nie destruktor. Konstruktor inicjalizuje obiekt na początku jego życia.
  • "zwalniająca pamięć przydzieloną dynamicznie w obiekcie" bywa praktycznym zastosowaniem destruktora, ale nie stanowi jego definicji. Destruktor może zwalniać różne zasoby (np. plik, gniazdo sieciowe), a czasem nie musi zwalniać pamięci dynamicznej wcale, jeśli klasa jej nie alokuje.
  • "porządkująca pamięć operacyjną po usuniętych obiektach" sugeruje działanie mechanizmu odśmiecania (GC) znanego z innych języków. C++ nie działa w ten sposób: destruktor sprząta zasoby konkretnego obiektu, a nie "porządkuje pamięć operacyjną" globalnie.

W praktyce destruktory są fundamentem bezpiecznego zarządzania zasobami: jeśli obiekt posiada zasób, destruktor jest miejscem, gdzie należy dopilnować jego zwolnienia. Dzięki temu po wyjściu z zakresu zasób jest zwalniany automatycznie.

Dodatkowe pytania

Dodatkowe pytania (FAQ):
Destruktor to specjalna funkcja składowa klasy uruchamiana automatycznie, gdy obiekt jest niszczony (kończy swoje życie). Najczęściej służy do zwolnienia zasobów należących do obiektu, np. zamknięcia pliku lub zwolnienia uchwytu.
Destruktor obiektu lokalnego wywołuje się przy wyjściu z zakresu, czyli na końcu bloku, funkcji lub w momencie obsługi wyjątków, gdy stos jest "odwijany". Dzięki temu zasoby obiektu są sprzątane automatycznie.
Nie zawsze. Destruktor zwalnia tylko to, co dana klasa sama posiada i za co odpowiada. Jeśli klasa nie alokuje pamięci dynamicznej, destruktor nie ma czego zwalniać. Może natomiast zwalniać inne zasoby, np. pliki, gniazda, blokady.
Konstruktor uruchamia się przy tworzeniu obiektu i służy do inicjalizacji stanu oraz zasobów. Destruktor uruchamia się przy niszczeniu obiektu i służy do zakończenia pracy obiektu oraz zwolnienia zasobów. To dwa przeciwne etapy cyklu życia.
Tak. Gdy usuwasz obiekt wskaźnikiem przez delete, najpierw wywoływany jest destruktor obiektu, a dopiero potem zwalniana jest pamięć. To ważne, bo destruktor ma szansę zwolnić zasoby przed oddaniem pamięci.
Bo sugeruje istnienie globalnego "sprzątania pamięci" jak w językach z garbage collector. W C++ destruktor dotyczy konkretnego obiektu i jego zasobów. Nie jest mechanizmem systemowym do ogólnego czyszczenia pamięci po wszystkich obiektach.
Nazwa destruktora jest stała: to tylda i nazwa klasy, np. dla klasy Plik będzie to ~Plik(). Destruktor nie ma typu zwracanego. Ta forma pozwala kompilatorowi rozpoznać, że chodzi o funkcję niszczącą obiekt.
Technicznie jest to możliwe w szczególnych sytuacjach (np. przy obiektach tworzonych przez placement new), ale w typowym kodzie aplikacyjnym się tego nie robi. Ręczne wywołanie destruktora łatwo prowadzi do podwójnego niszczenia i błędów.
Najczęstszy błąd to wybór odpowiedzi "przy tworzeniu obiektu", bo kojarzy się z "funkcją specjalną klasy". Pomaga zapamiętać schemat: konstruktor start (inicjalizacja), destruktor koniec (zwalnianie zasobów).
W destruktorze umieszcza się kod zwalniający zasoby posiadane przez obiekt: zamknięcie pliku, zwolnienie uchwytu, odblokowanie mutexu, zwolnienie pamięci alokowanej ręcznie. Dobrą praktyką jest projektowanie tak, by zasoby miały jednoznacznego właściciela.
info

Statystycznie 55% uczniów zna prawidłową odpowiedź. średnie

Specjaliści zwracają uwagę: "Destruktor to specjalna funkcja składowa klasy w C++, która uruchamia się, gdy obiekt kończy swoje życie (np. przy wyjściu z zakresu lub po delete)."

Źródła:

  • ISO/IEC 14882:2020(E) Programming Languages — C++, rozdział "Classes" / "Special member functions" (destructors), 2020
  • cppreference.com: "Destructor" – https://en.cppreference.com/w/cpp/language/destructor (dostęp: 2026-02-27)
  • Bjarne Stroustrup, "The C++ Programming Language", rozdziały o klasach i destruktorach (wydanie 4th Edition), Addison-Wesley, 2013

Materiały:

  • Dokumentacja języka C++ (sekcje o destruktorach i specjalnych funkcjach składowych)
  • cppreference – opis destruktorów i cyklu życia obiektu
  • Podręcznik do C++ omawiający klasy, konstruktory i destruktory

Aktualizacja pytania: 31.03.2026



Aktualizacja pytania: 31.03.2026
📡 Brak połączenia internetowego