Почему форма, указанная 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;
};