2012-01-22 3 views
0

이 예는 Stroustup의 책 제 3 판, 제 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입니다. 소멸자에서 가리키는 대상을 파괴하고 소멸자는 예외가 throw되는지 여부에 관계없이 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으로 Shape에 대한 포인터입니다 :

내부적으로 auto_ptr은 (관련 비트 만 해당) 본질적이다. 왜 파괴 될까요? – WaldB

+0

@ user1162978 : 'auto_ptr'에 넣었고'auto_ptr'은'auto_ptr'이 삭제 될 때 삭제합니다. –

+0

그래서 pbox가 파괴되어 pb가 파괴되었습니다. 니가 말하는거야? – WaldB

관련 문제