답변:
auto_ptr
알려진 결과를 사용하여 복사 할 수 있기 때문에 전역 찾기 / 바꾸기를 수행 할 수 없지만 unique_ptr
이동 만 할 수 있습니다. 보이는 것
std::auto_ptr<int> p(new int);
std::auto_ptr<int> p2 = p;
최소한 이런 식으로되어야합니다
std::unique_ptr<int> p(new int);
std::unique_ptr<int> p2 = std::move(p);
다른 차이점 unique_ptr
은 배열을 올바르게 처리 할 수 있습니다 (호출 delete[]
하는 동안 auto_ptr
호출하려고 시도합니다) delete
.
std::auto_ptr
및 std::unique_ptr
someways 등의 교체에 드롭 호환되지 않습니다. 따라서 찾기 / 바꾸기만으로는 충분하지 않습니다. 그러나 컴파일 오류를 통해 찾기 / 바꾸기 작업 후 이상한 코너 경우를 제외한 모든 것을 수정해야합니다. 대부분의 컴파일 오류에는을 추가해야합니다 std::move
.
unique_ptr
통과해야합니다 std::move
. 컴파일러가 제대로 이해하지 못하면 불평하기 때문에 이것은 간단합니다.std::auto_ptr
s 복사 의미론은 악하다. 수업이 복사를 허용하지 않으면 std::unique_ptr
대체품이 떨어집니다. 그러나 클래스에 합리적인 카피 의미를 주려고하면 std::auto_ptr
처리 코드 를 변경해야 합니다. 컴파일러가 제대로 이해하지 못하면 불만을 표시하므로 간단합니다. 특별한 코드 없이std::auto_ptr
멤버 와 함께 수업을 복사 할 수 있다면 부끄러운 일과 행운을 빕니다.요약 std::unique_ptr
하면 깨지지 않습니다 std::auto_ptr
. 컴파일 타임에을 사용할 때 종종 오류였던 동작을 허용하지 않습니다 std::auto_ptr
. 따라서 std::auto_ptr
필요한 관리와 함께 사용한다면 std::unique_ptr
간단하게 전환 할 수 있습니다. std::auto_ptr
의 이상한 행동 에 의존했다면 어쨌든 코드를 리팩터링해야합니다.
AFAIK unique_ptr
는 직접 교체가 아닙니다. 그것이 해결하는 주요 결함은 내재적 소유권 이전입니다.
std::auto_ptr<int> a(new int(10)), b;
b = a; //implicitly transfers ownership
std::unique_ptr<int> a(new int(10)), b;
b = std::move(a); //ownership must be transferred explicitly
반면에 unique_ptr
완전히 새로운 기능을 갖습니다. 컨테이너에 저장할 수 있습니다.
auto_ptr
허용되지 않는다고 언급했습니다.
Herb Sutter는 GotW # 89 에 대한 훌륭한 설명을 제공합니다 .
auto_ptr과의 거래는 무엇입니까? auto_ptr은 C ++이 이동 의미론을 갖기 전에 unique_ptr을 작성하려는 용감한 시도로 가장 자선 적으로 특징이 있습니다. auto_ptr은 이제 더 이상 사용되지 않으며 새 코드에서 사용해서는 안됩니다.
기존 코드베이스에 auto_ptr이있는 경우 전역 검색 및 auto_ptr을 unique_ptr로 대체하십시오. 대부분의 사용은 동일하게 작동하며, 컴파일 타임 오류로 노출되거나 자신이 모르는 버그를 수정 (조용히) 할 수 있습니다.
다시 말해, 전역 검색 및 교체는 코드를 일시적으로 "중단"할 수 있지만 어쨌든 코드를 수정해야합니다.