2014-02-14 2 views
4

auto_ptr 클래스의 작동 방식에 대한 특정 정보를 이해하려고합니다. 다음 클래스를 가지고 있다고 가정 해 봅시다 (할당 연산자의 세밀한 포인트를 설명하는 웹 사이트에서이 클래스를 발견했습니다).auto_ptr을 이해하려고 시도 중

class TFoo : public TSuperFoo { 
    auto_ptr<TBar> fBar1; 
    auto_ptr<TBar> fBar2; 
public: 
    TFoo& TFoo::operator=(const TFoo& that); 
    // various other method definitions go here... 
} 

이제 할당 연산자를 구현합니다.

TFoo& TFoo::operator=(const TFoo& that) 
{ 
    if (this != &that) { 
     auto_ptr<TBar> bar1 = new TBar(*that.fBar1); 
     auto_ptr<TBar> bar2 = new TBar(*that.fBar2); 

     fBar1 = bar1; 
     fBar2 = bar2; 
    } 
    return *this; 
} 

그는 두 번째 새로운 작업이 실패하면 우리가 기능을 종료 할 때, 첫 번째 새 TBar는 auto_ptr은의 소멸자에 의해 삭제됩니다, 여기

말을 계속한다. 그러나 new가 모두 성공하면 할당은 이전에 가리킨 fBar1과 fBar2 객체를 삭제하고 bar1과 bar2를 제로화하여 소멸자가 함수를 종료 할 때 아무 것도 삭제하지 않도록합니다.

제 질문은 왜 bar1과 bar2가 제로화 될 것입니까? 그게 무슨 소리 죠? 당신이 뭔가를 할 필요가 없어요.

fBar = bar1.release(); 

감사합니다.

+1

'auto_ptr'에 대해 이해해야 할 유일한 것은 깨 졌으므로 사용해서는 안된다는 것입니다. –

+0

@Captain 일부 상황에서는 완벽하게 문제가 해결되지 않습니다. C++ 11을 사용하는 경우에는 사용할 이유가 없습니다. 그러나 C++ 03에는 때로는 좋은 대안이 없습니다. 어쨌든, 질문은 좋은 것이고'unique_ptr'에도 적용됩니다. – juanchopanza

+0

[Copy-Swap Idiom] (http://stackoverflow.com/q/3279543/10077)에 대해 배우고 싶을 수도 있습니다. –

답변

4

할당 연산자 auto_ptr은 개체 소유권을 양수인에게 넘겨 주어 실제로 개체가 할당 된 auto_ptr을 해제합니다. 따라서 대입 연산자의 의미는 상당히 직관적이지 못합니다. 이는 아마도 auto_ptr이 더 이상 사용되지 않고 unique_ptr으로 대체되어야하는 주된 이유 일 것입니다.

+0

감사합니다. 그러나 나는 아직도 이해하고 싶다 ... 나는 나를 괴롭히는 더 근본적인 C++ 질문을 추측한다. bar1은 할당 된 것입니다. 그래서 제로 그 자체를 알지 못할 것입니다, 그렇죠? 그러므로 나는 fBar1이 auto_ptr이기 때문에 fBar1의 할당 연산자에서 bar1을 제로화해야한다는 것을 추측하고 있습니다. 모든 해답을 가져 주셔서 감사합니다. – driftwood

+1

@ user2722568 : 그렇습니다. 대상 피연산자'fBar1'에서 호출 된 대입 연산자는 소스 피연산자'bar1'을 수정합니다. –

+0

대단히 감사합니다. 원래 저자 (Tbar/TFoo 클래스) 언어가 나를 혼란스럽게 만들었습니다. – driftwood

관련 문제