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.