Jakie destruktory są uruchamiane, gdy konstruktor wyrzuca wyjątek?
W C++, jeśli konstruktor wyrzuca wyjątek, to jakie destruktory są uruchamiane?
W szczególności, czy to robi jakąś różnicę, jeśli wyjątek jest podczas listy inicjalizacji lub ciała?
A co z dziedziczeniem i członkami? Prawdopodobnie wszystkie ukończone konstrukcje ulegają zniszczeniu. Jeśli tylko niektóre elementy są konstruowane, czy tylko te ulegają zniszczeniu? Jeśli istnieje wiele dziedziczeń, czy wszystkie ukończone konstruktory ulegają zniszczeniu? Czy wirtualne dziedziczenie się zmienia cokolwiek?
3 answers
Jeśli konstruktor wyrzuca wyjątek, jakie destruktory są uruchamiane?
Destruktory wszystkich obiektów całkowicie utworzonych w tym zakresie.
Czy robi to jakąś różnicę, jeśli wyjątek jest podczas listy inicjalizacyjnej lub ciała?
Wszystkie ukończone obiekty zostaną zniszczone.
Jeśli konstruktor nigdy nie został całkowicie nazwany obiekt nigdy nie został zbudowany i dlatego nie może zostać zniszczony.
A co z dziedziczeniem i członkami? Prawdopodobnie wszystkie ukończone konstrukcje ulegają zniszczeniu. Jeśli tylko niektóre elementy są konstruowane, czy tylko te ulegają zniszczeniu? Jeśli istnieje wiele dziedziczeń, czy wszystkie ukończone konstruktory ulegają zniszczeniu? Czy wirtualne dziedziczenie coś zmienia?
Wszystkie ukończone konstrukcje ulegają zniszczeniu. Tak, tylko całkowicie stworzone obiekty ulegają zniszczeniu.
Dobra Lektura:
Szczególnie kocham tę część, w której wyjaśnia:
W kategoriach biologicznych, poczęcie miało miejsce -- konstruktor zaczął --, ale mimo najlepszych starań po nim następowało poronienie -- konstruktor nigdy nie biegł do terminu (inacji).
Nawiasem mówiąc, dlatego Destruktor nigdy nie zostanie wywołany, jeśli konstruktor się nie powiedzie - nie ma nic do zniszczenia. Nie może umrzeć, bo nigdy nie żył." zauważ, że to sprawia, że fraza "obiekt, którego konstruktor wyrzucił wyjątek" naprawdę oksymoron. Coś takiego jest nawet mniejsze niż były obiekt... nigdy nie żyła, nigdy nie oddychała.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-18 15:41:49
W C++, jeśli konstruktor wyrzuca wyjątek, jakie destruktory są uruchamiane?
Wszystkie obiekty, które miały konstruktory, są ukończone.
Nie. Wszyscy członkowie, którzy są w pełni zbudowani przed wyjątkiem, będą mieli uruchomione destruktory. Członek, który rzucił podczas budowy i wszystkich innych członków niezrealizowanych będzie nie niech ich destruktory działają. Kolejność budowy członu jest dobrze zdefiniowana i dlatego wiesz dokładnie, co się stanie, biorąc pod uwagę, że znasz punkt rzutu wyjątkowego.W szczególności, czy to robi jakąś różnicę, jeśli wyjątek jest podczas listy inicjalizacji lub ciała?
A co z dziedziczeniem i członkami?
Obowiązuje ta sama zasada.
Prawdopodobnie wszystkie ukończone konstrukcje ulegają zniszczeniu.
Tak
Jeśli tylko niektóre elementy są konstruowane, czy tylko te ulegają zniszczeniu?
Tak
Jeśli istnieje wiele dziedziczeń, czy wszystkie ukończone konstruktory ulegają zniszczeniu?
Tak
Czy wirtualne dziedziczenie coś zmienia?Nie.
Ale uwaga: dziedziczenie wirtualne ma wpływ na kolejność wywoływania konstruktorów. Jeśli nie wiesz, jak zdefiniowano zamówienie, może to być nie intuicyjne, dopóki nie znajdziesz dokładnych zasad.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-18 16:48:27
Każdy obiekt utworzony w lokalnym zakresie pozostawiony z powodu konstruktora będzie zostać zniszczonym. Obsługa runtime wchodzi z powrotem do stosu, wywołując Niszczyciele, dopóki nie znajdzie opiekuna.
Jeśli wyjątek jest wyrzucany z konstruktora, destruktory wszystkich
zostaną wywołane całkowicie zbudowane podobiekty. Ponadto, jeżeli
konstruktor był częścią wyrażenia new
, odpowiednie umieszczenie
operator delete zostanie wywołany, jeśli istnieje.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-18 15:43:29