2013-07-15 14 views
12

Powszechnie wiadomo, że jeśli konstruktor rzuci, wszystkie w pełni skonstruowane sub-obiekty zostaną zniszczone w odwrotnej kolejności, w tym dane członków i wszystkie rodzaje klas bazowych. Jednak destruktor nie jest wywoływany dla nie-delegujących konstruktorów. Dla konstruktora delegującego obiekt został skonstruowany po wprowadzeniu ciała konstruktora, ale konstrukcja kontynuuje w pewnym stopniu. Powstaje zatem pytanie, czy destruktor klasy jest wywoływany, jeśli konstruktor delegujący zgłasza wyjątek z wnętrza swojego ciała?Czy destruktor jest wywoływany podczas rzucania konstruktora delegującego?

class X 
{ 
public: 
    X(); 
    X(int) : X() { throw std::exception(); } // is ~X() implicitely called? 
    ~X(); 
}; 
+2

'X' nie jest obiektem członkowskim' X', więc dlaczego miałby zostać wywołany jego destruktor? – Praetorian

+5

@Praetorian: Ponieważ został w pełni skonstruowany przez delegującego konstruktora; i ponieważ standard mówi, że tak będzie. –

+1

Powiązane: http://stackoverflow.com/q/14386840/981959 –

Odpowiedz

12

Zasadą jest, że destruktor jest nazywany przez wszystkich w pełni budowanych obiektów. Obiekt jest uważany za w pełni skonstruowany po zakończeniu konstruktora, łącznie z delegowanym konstruktorem (nawet jeśli program jest kontynuowany w innym konstruktorze ).

+0

Czy można zacytować standardowe odniesienie do tego (choć robi to intuicyjny sens)? –

+2

@MarkB §15.2/2 "[...] Podobnie, jeśli nie delegujący konstruktor dla obiektu obiekt zakończył wykonywanie, a konstruktor delegujący dla tego obiektu zostanie zamknięty z wyjątkiem, zostanie wywołany destruktor obiektu . ...] ". –

+0

Nie jestem pewien, czy podoba mi się to zachowanie. –

5

Żywotność obiektu rozpoczyna się, gdy każdy konstruktor (tj. W przypadku delegowania uprawnień ulti- kolega konstruktor docelowy) jest z powodzeniem zakończone. Dla celów [C++ 03] §3.8 "zakończono wywołanie konstruktora " oznacza dowolne wywołanie konstruktora. Oznacza to, że wyjątek wyrzucony z treści konstruktora delegującego spowoduje automatyczne wywołanie destructorto.

source.

I here to fajny artykuł o delegowaniu konstruktorów, jeśli ktokolwiek chciałby go przeczytać.

+1

Poza tym źródło, które cytujesz, jest wczesną propozycją tej funkcji. Dokładne słowa, które powołujesz, nie tworzą go w ostatecznym standardzie, a przynajmniej nie mogę ich znaleźć. I "miły artykuł", który cytujesz, jest bardziej o tym, co zrobić, gdy nie masz delegujących konstruktorów. –

Powiązane problemy