0

この例は、Stroustup の本、第 3 版、セクション 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 に答える