unique_ptr не вызывает деструктор в try / catch

0

У меня есть класс:

class Foo
{
public:
   Foo()
   {
       something_ = new int;
       throw std::exception("Bad");
   }
   ~Foo()
   {
       delete something_;
   } 
}

Тогда у меня есть этот пример кода:

// Destructor is called
{
    std::unique_ptr<Foo> foo;
    foo.reset(new Foo());
}

// Destructor is NOT called
try
{
    std::unique_ptr<Foo> foo;
    foo.reset(new Foo());
}
catch(std::exception e)
{
}

Я не совсем понимаю, почему деструктор не вызван в try/catch. Не истекает ли срок действия unique_ptr для вызова dtor?

Спасибо за любую информацию.

Теги:

1 ответ

2

Во-первых, исключение выбрасывается из конструктора Foo, т.е. до того, как объект будет создан и назначен unique_ptr.

Во-вторых, деструктор для объекта не будет вызываться в любом случае, если конструктор не удался.

  • 0
    Так почему же в первом примере деструктор называется?
  • 1
    @ BigHands79 Не должно. Может ли быть так, что вы видите что-то вроде окна отладки, которое предлагает вам игнорировать необработанное исключение? И если вы это сделаете, возможно, выполнение продолжается сразу после throw , но состояние приложения испортилось.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню