0

这个例子取自 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();
    / / ...
}

“这里的Rectangle,pb指向的Shape,pc指向的Circle,不管是否抛出异常,都被删除了。”

4

1 回答 1

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;
};
于 2012-01-22T11:49:48.553 回答