2013-01-10 13 views
7

Jeśli inicjalizacji unique_ptr takiego:std :: unique_ptr :: reset i wyjątki konstruktor

std::unique_ptr<Foo> i; 
i.reset(new Foo()); 

ale jest wyjątek od Foo::Foo(), pytanie brzmi: co się dzieje z pamięcią rozdzielone? w jaki sposób unique_ptr unika wycieku? czy to coś jest obsługiwane wewnątrz operatora new?

Destruktor zostanie wywołany z chwilą opuszczenia lunety. Ponieważ wywołanie reset nie jest wywoływane, dopóki nie zwróci się new Foo(), wydaje się, że musi ono być obsługiwane przez new, zwalniając przydzieloną pamięć, gdy wyjątek opuszcza konstruktor.

Czy tak się dzieje?

+0

Zobacz http://stackoverflow.com/questions/4094996/what-happens-to-the-memory-allocated-by-new-if-the-constructor-throws – Jon

Odpowiedz

10

Jeśli zostanie zgłoszony wyjątek w konstruktorze Foo, funkcja reset unikalnego wskaźnika nigdy nie zostanie wykonana w pierwszej kolejności. Dzięki temu unikalny wskaźnik zachowuje swoją oryginalną wartość.

Wyrażenie new nie powoduje przecieku pamięci, jeśli konstrukcja obiektu zgłasza wyjątek.

+0

A jeśli masz 'make_unique', możesz użyj 'i = make_unique ()'. – GManNickG

+0

Co dalej z 'std :: unique_ptr p = new Bla();' – Nick

+0

@Nick: Co z tym? Próbowałeś tego? –

Powiązane problemy