2014-10-01 2 views
1

std::unique_ptr은 포인터를 통해 개체의 단독 소유권을 유지하고 unique_ptr이 범위를 벗어날 때 해당 개체를 파괴하는 스마트 포인터입니다. 두 개의 unique_ptr 인스턴스가 동일한 개체를 관리 할 수 ​​없습니다.고유 포인터는 고유성을 어떻게 보장합니까?

마지막 문장은 어떻게 보장됩니까?

"누군가"는 이미 존재하는 std::unique_ptr 중 하나가 이미 원시 포인터를 소유하고 있는지 확인하는 STL이라고 생각하지 않습니다. 이것은 선형 복잡성 알고리즘이라 할지라도 엄청난 수의 고유 포인터로 인해 매우 비효율적입니다. 멋진 트릭이 있어야합니다.

+0

표준 견적서입니까? 그것이 어디에서 온 것인가? – user2079303

+0

아니요, 여기에 있습니다 : http://en.cppreference.com/w/cpp/memory/unique_ptr – Narek

답변

13

보장되지 않습니다. 이름은 의도 된 사용법에 대한 설명이며 런타임 시스템에 의해 완전히 강제되는 것은 아닙니다. 즉,이 코드를 쓸 수있다 :

std::unique_ptr<int> i1(new int()); 
std::unique_ptr<int> i2(i1.get()); 

을 당신은 같은 객체를 참조하는 두 unique_ptr의가 있지만, 두 번 포인터를 삭제하기 때문에 프로그램이 동작을 정의되지 않은있다.

unique_ptr은 실수로 그러한 포인터를 두 개 만드는 것이 어렵도록 복사 할 수 없습니다. C++은 Machiavelli가 아닌 Murphy를 보호합니다.

+4

또는 [Stroustrup] (https://en.wikiquote.org/wiki/Bjarne_Stroustrup)은 다음과 같이 말합니다 : * " C는 발에서 자신을 쉽게 쏠 수있게 해줍니다. C++은 더 어렵게 만들지 만, 그렇게하면 다리가 날아갑니다. "* – 5gon12eder

+0

젠장! 나는 이것을 사용하지 못할 것이다. – Narek

+1

+1 그리고 이것은 머피에 대한 고전적인 _protects입니다. Machiavelli가 아닙니다. – Niall

1

고유하다고하는 이유는 고유 한 포인터를 복사 할 수 없기 때문입니다. 값을 훔칠 수는 있지만 원래 unique_ptr은 비워 둡니다.

관련 문제