为什么在下面的例子中抛出异常时,pb指向的Shape被销毁

Why the Shape pointed by pb is destroyed when an exception is thrown in the example below?

本文关键字:Shape pb 在下面 为什么 抛出异常      更新时间:2023-10-16

这个例子取自Stroustup的书,第三版,第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指向的圆无论是否引发异常。"

它被销毁了,因为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;
};