문제

왜 그것이 잘못 사용 std::auto_ptr<> 표준 컨테이너?

도움이 되었습니까?

해결책

C++표준 STL 요소가 있어야 합"복사이 가능하고"및"양도할 수 없습니다." 다시 말해서,요소가 될 수 있어야 할당되거나 복사하고 다음과 같은 두 가지 요소가 논리적으로 독립적이다. std::auto_ptr 을 수행하지 않습니다.

예를 들어 이 코드:

class X
{
};

std::vector<std::auto_ptr<X> > vecX;
vecX.push_back(new X);

std::auto_ptr<X> pX = vecX[0];  // vecX[0] is assigned NULL.

이러한 한계를 극복하기 위해 사용해야 합니다 std::unique_ptr, std::shared_ptrstd::weak_ptr 스마트 포인터 또는 부스트 동등이 없는 경우 C++11. 여기에 향상 라이브러리에 대한 문서 이러한 스마트 포인터입니다.

다른 팁

본 의미auto_ptr 와 호환 되지 않는 용기입니다.

특히,복사 하나 auto_ptr 을 다 만들지 않는 동일한 두 개체 중 하나가 소유권의 포인터이다.

더 구체적으로 복사 auto_ptr 원인 중 하나의 복사본을 가게의 포인터이다.는 이들의 유 컨테이너에 정의되어 있지 않습니다.따라서,무작위로 할 수 있습을 잃게 액세스 포인터를 저장하는 경우 auto_ptrs 에서 컨테이너입니다.

두 개의 최고 우수한 제목에 기사:

STL 컨테이너해야 복사할 수 있는 항목을 저장소에서,그리고 설계 기대하는 원본과 복사본을 것 같습니다.자동차 포인터를 객체가 완전히 다른 계약,그것에 의하여 복사를 만들의 소유입니다.즉,용기의 auto_ptr 전시할 것입니다 이상한 행동에 따라 사용합니다.

거기에 대한 자세한 설명에서 잘못 될 수 있는 효과적인 STL(스코트 마이어스)항목을 8 과도 그렇지 못한 자세한 설명에서 효과적인 C++(스코트 마이어스)13.

STL 컨테이너 저장의 사본을 포함되는 항목입니다.면 auto_ptr 복사,그것은 세전 ptr null.많은 컨테이너 방법은 이 행동입니다.

C++03 표준(ISO-IEC14882-2003) 에서 말하는 절 20.4.5 제 3 항:

[...] [참고:[...] auto_ptr 을 충족하지 않 CopyConstructible 및 할당 요구사항에 대한 표준 라이브러리 컨테이너 요소 및 따라서 인스턴스화하는 표준 라이브러리 컨테이너 로 auto_ptr 결과에서 정의되지 않은 행동이다.—엔드 노트]

C++11 표준(ISO-IEC14882-2011) 에서 말하는 것 부록 D.10.1 단락을 3:

[...] 참고:[...]의 인스턴스 auto_ptr 의 요구 사항을 충족 MoveConstructible 및 MoveAssignable 지만,요구 사항을 충족하지 않는 의 CopyConstructible 및 CopyAssignable.—end 참고]

C++14 표준(ISO-IEC14882-2014) 에서 말하는 것 부록 C.4.2 Annex D:호환성 기능:

변경:클래스 템플릿 auto_ptr,unary_function 및 binary_function,기능 템플릿 random_shuffle 고 기능 템플릿(그리고 자신의 복귀형)ptr_fun,mem_fun, mem_fun_ref,bind1st 및 bind2nd 는 정의되지 않았습니다.
이론적 설명:대체하여 새로운 기능을 제공합니다.
에 효과 원래 기능:유효한 C++2014 코드를 사용하는 이러한 클래스 템플릿 및 기능 템플릿에 실패할 수 있게 컴파일에서 이 국제 표준입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top