2012-01-22 5 views
0

この例では、Stroustupの著書、第三版、セクション14.4.2から撮影された:ここでは以下の例で例外がスローされたときに、pbが指す形状が破棄されるのはなぜですか?

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で指さ かどうか削除されます例外がスローされます。

+0

... – Xeo

答えて

1

これは破壊されているのは、それがauto_ptrのためです。デストラクター内のポイント先のオブジェクトを破棄し、例外がスローされたかどうかにかかわらず、auto_ptrがスコープを離れるとデストラクタが呼び出されます。それがC++の仕組みです。

template <typename T> 
struct auto_ptr 
{ 
    auto_ptr(T* ptr) : m_ptr(ptr) {} 
    ~auto_ptr() { delete m_ptr; } 
private: 
    T* m_ptr; 
}; 
スマートポインタ上に読む
+0

しかし、PB形状へのポインタです:

内部的には、auto_ptrは(該当するビットのみ)が本質的です。それはなぜ破壊されるのだろうか? – WaldB

+0

@ user1162978:これは 'auto_ptr'に入れてあり、' auto_ptr'は 'auto_ptr'が破壊されたときに削除します。 –

+0

pboxが破壊されたので、pbは破壊されます。それはあなたが言っていることですか? – WaldB