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

Этот пример был взят из книги Страуступа, третье издание, раздел 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 Ответ

1 голос
/ 22 января 2012

Он уничтожен, потому что это то, что делает 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;
};
...