단순히 unique_ptr
이동에만 뾰족한-하는 객체에 대한 소유권을 변경하지만 무효화하지 않습니다 ('내용'아마 잘못된 단어입니다. 나는 당신이 포인터를 역 참조 할 때 얻을 수있는 데이터를 의미) 삭제). 포인터가 삭제되지 않은만큼 유효합니다 unique_ptr<>::get()
에 의해 지적했다. 그것은는이 unique_ptr<>
소유의 소멸자에 의해, 예를 들어, 삭제됩니다. 따라서 :
물론
obj*ptr = nullptr; // an observing pointer
{
std::unique_ptr<obj> p1;
{
std::unique_ptr<obj> p2(new obj); // p2 is owner
ptr = p2.get(); // ptr is copy of contents of p2
/* ... */ // ptr is valid
p1 = std::move(p2); // p1 becomes new owner
/* ... */ // ptr is valid but p2-> is not
} // p2 destroyed: no effect on ptr
/* ... */ // ptr still valid
} // p1 destroyed: object deleted
/* ... */ // ptr invalid!
, 당신은 이동-에서 unique_ptr
에 내용이 없습니다 때문에,에서 이동 된 unique_ptr
를 사용하려고해서는 안됩니다. 따라서
std::unique_ptr<obj> p1(new obj);
std::unique_ptr<obj> p2 = std::move(p1);
p1->call_member(); // undefined behaviour
그 포인터 뒤에 객체는 파괴되지 않는다. 그리고 개체의 주소는 바꿀 수 없습니다. 따라서 주소는 유효해야합니다. – Columbo
@drescherjm 아니, 이동 한 후, 최초의 unique_ptr은 아무것도 소유하지 않습니다. – juanchopanza
지금 봅니다. 나는 실수로 a_ptr이 이동에 사용되었다고 생각했습니다. (이것은 나에게 의미가 없기 때문에주의 깊게 읽어야합니다.) – drescherjm