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?

Author: Guy Avraham, 2012-04-18

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:

Konstruktor: Herb Sutter

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.

 62
Author: Alok Save,
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.

W szczególności, czy to robi jakąś różnicę, jeśli wyjątek jest podczas listy inicjalizacji lub ciała?

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.
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.
 17
Author: Martin York,
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.

 4
Author: James Kanze,
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