2016-10-20 1 views
3

*을 호출하는 대신 get()*과 함께 사용하는 이유는 무엇입니까?auto_ptr을 사용할 때 * ptr과 * ptr.get()의 차이점은 무엇입니까?

다음 코드를 고려하십시오

auto_ptr<int> p (new int); 
*p = 100; 
cout << "p points to " << *p << '\n';   //100 

auto_ptr<int> p (new int); 
*p.get() = 100; 
cout << "p points to " << *p.get() << '\n'; //100 

결과가 정확히 동일합니다. get()은 (는) 더 안전합니까?

+3

사실상 차이가 없습니다. – Nawaz

+7

태그가 추가 된 C++ 11 :'std :: auto_ptr'은 더 이상 사용되지 않으며 C++에서 제거 될 것입니다. 대신'std :: unique_ptr'을 사용하십시오. –

+2

"get()이 더 안전합니까?" 'auto_ptr'을 사용하면 내 코드가 전체 코드를 불안하게 만듭니다. 사용하지 마십시오. –

답변

6

실질적으로 차이가 없습니다. *p 경우

( auto_ptr 의해 정의 됨)에 과부하가 operator* (멤버 함수에 의해 수행되는 것이 — 역 참조 후) 기본 객체에 대한 참조를 반환 호출된다. 그러나 후자의 경우 p.get()은 자신을 역 참조하는 기본 포인터를 반환합니다.

질문에 대한 답변이 되었기를 바랍니다. 이 심하게 같은 std::unique_ptrstd::shared_ptr (std::weak_ptr와 함께)와 같은 다른 스마트 포인터에 우선하여, 심지어 사용되지 않습니다 —을 설계로 지금은, std::auto_ptr를 사용 을 피에 조언을 것입니다.

4

효과적 차이가 없습니다. operator**get() (cppreference)을 반환하도록 정의됩니다.

unique_ptrauto_ptr 대신 사용하는 것이 좋습니다. 후자는 현재의 C++ 표준에서 제거되었으며 매우 직관적이지 않은 양면 복사 동작을합니다.

5

*pauto_ptr::operator*으로, 관리되는 포인터를 역 참조합니다.

첫 번째 호출 메서드 auto_ptr::get은 관리되는 포인터를 반환하며이 포인터는 관리 자 *에 의해 참조 해제됩니다.

이렇게하면 실행 된 결과와 똑같은 결과를 얻을 수 있습니다. 관리되는 포인터가 역 참조되므로 get을 사용할 때 추가 검사가 수행되지 않습니다.

auto_ptr은 C++ 11 이후로 사용되지 않습니다. 포인터의 소유권이 옮겨진되기 때문에 복사 할 때 그것은 위험하다 :

std::auto_ptr<int> p(new int(42)); 

{ 
    std::auto_ptr<int> copy_of_p(p); // ownership of *p is transfered here 

    // ... 

    p = copy_of_p; // p gets back ownership 
} // copy_of_p is destroyed, but doesn't delete pointer owned by p 

// p is still valid 

사용 unique_ptr 또는 shared_ptr 대신 :

std::auto_ptr<int> p(new int(42)); 

{ 
    std::auto_ptr<int> copy_of_p(p); // ownership of *p is transfered here 
} // copy_of_p is destroyed, and deletes its owned pointer 

// p is now a dangling pointer 

이 문제를 방지하려면, 당신은 "관리되는 포인터를 관리"했다.

0

스마트 포인터에 get()을 사용하지 마십시오 (auto_, unique_, shared_ 또는 기타와 관계 없음). 이것은 RAII 클래스의 제어하에 있지 않은 알몸 포인터를 반환합니다. 이것은 다른 RAII 클래스에 포인터를주는 다양한 가능성을 열어 주며 (나중에 이중 삭제를 야기 함) 포인터를 삭제하는 것과 같은 바보 같은 일을하는 호출자는 다시 이중 삭제를 유발합니다. 스마트 포인터를 역 참조하십시오.

추 신 : 전문가 전용 : 예, 스마트 포인터에서 원시 포인터를 추출하는 다른 합법적 인 이유가 있습니다. 그러나 일반적으로 get()을 사용하지 않으면 사용 된 시간이 "여기에 펑키 한 무언가가있다"라는 붉은 깃발이됩니다.

관련 문제