Nie, wyrzucenie wyjątku jest najlepszym sposobem zasygnalizowania błędu podczas konstruowania obiektu. (. Ponieważ nie ma wartości powrotu, nie ma innego wyjścia, inne niż konstruowanie bezgłowe obiekt, który jest zły styl w C++)
Od samego człowieka, Bjarne Stroustrup: http://www.stroustrup.com/bs_faq2.html#ctor-exceptions
Re: „Ale mój destruktor nie został nazwany "
Rzeczywiście. W C++ mówi się, że okres istnienia obiektu rozpoczyna się, gdy konstruktor zostanie ukończony. I kończy się zaraz po wywołaniu destruktora. Jeśli ctor rzuca, to dtor nie jest wywoływany.
(Ale dtors wszelkich obiektów zmiennych członkiem, których ctors już prowadził do zakończenia przed ten Ran konstruktor, nazywane są).
należy skonsultować się standardem, czy dobry podręcznik więcej szczegółów esp. związane z tym, co dzieje się, gdy w grę wchodzi dziedziczenie. Jako ogólna zasada, destruktory są wywoływane w odwrotnej kolejności budowy.
Twoje pytanie o to, dlaczego "~ B" nie zostało wywołane w twoim konkretnym kodzie, to dlatego, że nie złapałeś wyjątku w main. Jeśli zmienisz swój kod tak, aby główny przechwycił wyjątek, zostanie wywołany "~ B()". Kiedy jednak zostanie zgłoszony wyjątek, który nie ma żadnego haczyka, implementacja może zakończyć program bez wywoływania destruktorów lub niszczenia statycznie zainicjowanych obiektów.
odniesienia w standardowej C++ 11 (nacisk kopalni)
15.5.1 :: rozwiązać std() funkcja [except.terminate]
W niektórych sytuacje obsługa wyjątków musi zostać porzucona dla mniej subtelnych technik obsługi błędów.
...
W takich przypadkach, std :: terminate() jest wywoływana (18.8.3). W sytuacji, gdy nie znaleziono zgodnego programu obsługi, jest on definiowany przez implementację niezależnie od tego, czy stos jest rozwijany przed wywołaniem funkcji std :: terminate().
Wyrzuciłeś wyjątek i go nie złapałeś, więc program się zakończył. Co sprawia, że myślisz, że to UB? – Beta