2014-05-18 4 views
2

나는 std :: unique_ptr에서 작업을하고 있지만 의미에 대해서는 혼란 스럽다. documentation,std :: unique_ptr의 고유성

No two unique_ptr instances can manage the same object 

그러나, 그것은 아마 바보 같은 예에서도 힘든에서 같은 코드를 고려한다.

std::unique_ptr<int> a(new int(10)); 
std::unique_ptr<int> b = std::unique_ptr<int>(a.get()); 
std::cout << *b << std::endl; 
*a = 5; 
std::cout << *b; 

A와 B는 여기에 동일한 개체를 관리하고, 출력은 10 5입니다 물론 내가 디버그 모드에서 마지막에 어설 션 실패 오류를 얻고있다 동일한 개체를 폭파하려고 인해 두 개의 독특한 ptrs 범위 끝.

나는 그것이 어리 석다는 것을 알고있다. 그런 사용법은 권고되지 않았지만, 매우 분명한 (클래스 멤버가 다른 것을 호출하는 등), 어설 션 실패가 내가 시작한 것이었을 때 나는 이것을 보았다.

내 질문은 위의 문장이 정확히 의미하는 것입니다 : 그것은 표준에 의해 제기되고 괜찮은 컴파일러는 당신이 그것을 할 수 있도록해서는 안됩니다 (나는 vs2013 btw에 있습니다) 또는 그렇게해야합니다 (결코 두 개의 unique_ptrs 포인트 동일한 객체로) (unique_ptrs의 목적은 아마도 우리가 덜 걱정할 것 같지 않기 때문입니다.) 또는 unique_ptr이 관련 될 때 원시 포인터 (a.get())에 대해서는 아무 것도 사용하지 않아야합니다.

답변

2

마지막 문장이 정확합니다. 아래 라인에서 a.get()으로 원시 포인터를 사용하자마자 std::unique_ptr이하는 모든 약속을 버렸습니다. 원시 포인터로 변환하는 a.release()을 사용하는 것입니다 동안

std::unique_ptr<int> b = std::unique_ptr<int>(a.get()); 

올바른 의미

는 고유성을 유지합니다. documentation에 의해 주어진대로, 두 std::unique_pointer 인스턴스간에 소유권을 이동 한 경우

std::unique_ptr<int> b = std::unique_ptr<int>(a.release()); 

물론, 당신은 일반적으로 단지 std::move에 할당 또는 initializatoin을 사용합니다. 아래의 두 행 중 하나가 유효해야합니다.

std::unique_ptr<int> b(std::move(a)); 
std::unique_ptr<int> b = std::move(a); 

std::move 의미를 더 명확하게 만들려면 다음 테스트 프로그램을 고려하십시오.

내 시스템에서 출력은 다음과 같습니다. 첫 번째 행과 마지막 행이 일치하는지 확인하십시오.

0x1827010 
(nil) 
0x1827010 
+0

'std :: unique_ptr b = std :: move (a);'를 사용해야합니다. 'std :: unique_ptr'에 이동 지정을 사용해야합니다. – ECrownofFire

+0

@ECrownofFire, Fixing, thanks ... 확인 했어야합니다. – merlin2011

+0

나는 움직이는 semantcis를 이해하는 데 어려움을 겪고있다. 내가 이해할 때,이 줄은 a가 가리키는 것이 무엇이든간에 b를 가리키고, null을 가리킨다. – bahti

관련 문제