Почему форма, указанная pb, уничтожается, когда в приведенном ниже примере выдается исключение?

Этот пример был взят из книги Страуступа, третье издание, раздел 14.4.2:

void f (Point p1, Point p2, auto_ptr<Circle> pc, Shape* pb)
{
    auto_ptr<Shape> p (new Rectangle(p1 ,p2));
    auto_ptr<Shape> pbox(pb);
    p->rotate(45);
    / / ...
    if (in_a_mess ) throw Mess();
    / / ...
}

"Здесь Прямоугольник, Форма, на которую указывает pb, и Круг, на который указывает pc, удаляются независимо от того, было ли выброшено исключение".

1 ответ

Решение

Это разрушено, потому что это то, что auto_ptr делает. Он разрушает указанный объект в своем деструкторе, и деструктор вызывается, когда auto_ptr покидает область, вне зависимости от того, выброшено или нет исключение. Вот как работает C++.

Внутренне auto_ptr по существу (только соответствующие биты):

template <typename T>
struct auto_ptr
{
    auto_ptr(T* ptr) : m_ptr(ptr) {}
    ~auto_ptr() { delete m_ptr; }
private:
    T* m_ptr;
};
Другие вопросы по тегам