Nie, zależy od sytuacji, czasami jest to uzasadniony i dobry projekt.
Aby zrozumieć, dlaczego i kiedy należy jawnie wywoływać destruktory, przyjrzyjmy się, co się dzieje z „nowym” i „usuń”.
Aby dynamicznie utworzyć obiekt, T* t = new T;
pod maską: 1. przydzielany jest rozmiar pamięci (T). 2. Konstruktor T jest wywoływany w celu zainicjowania przydzielonej pamięci. Operator new robi dwie rzeczy: alokację i inicjalizację.
Aby zniszczyć obiekt delete t;
pod maską: 1. Wzywa się destruktor T. 2. pamięć przydzielona dla tego obiektu zostaje zwolniona. operator delete robi również dwie rzeczy: zniszczenie i cofnięcie alokacji.
Jeden pisze konstruktor, aby przeprowadzał inicjalizację, a destruktor, aby przeprowadzał niszczenie. Kiedy jawnie wywołujesz destruktor, następuje tylko zniszczenie, ale nie cofnięcie alokacji .
Dlatego uzasadnione użycie jawnego wywołania destruktora mogłoby brzmieć: „Chcę tylko zniszczyć obiekt, ale nie (lub nie mogę) zwolnić alokacji pamięci (jeszcze)”.
Typowym tego przykładem jest wstępne przydzielanie pamięci dla puli określonych obiektów, które w innym przypadku muszą być przydzielane dynamicznie.
Tworząc nowy obiekt, otrzymujesz porcję pamięci ze wstępnie przydzielonej puli i wykonujesz „umieszczenie nowego”. Po zakończeniu pracy z obiektem możesz chcieć jawnie wywołać destruktor, aby zakończyć czyszczenie, jeśli takie ma miejsce. Ale tak naprawdę nie zwolnisz pamięci, tak jak zrobiłby to operator delete. Zamiast tego zwracasz fragment do puli w celu ponownego wykorzystania.