2015-02-05 2 views
2

나는 이동-에서 std::unique_ptr입니다 정의되지 않은 동작의 내용에 멤버 함수를 호출하는 것을 이해하는 주도했습니다. 내 질문은 : 나는 unique_ptr에 .get()를 호출 다음으로 이동 경우, 원래 .get() 포인터가 원래의 고유 한 포인터의 내용을 가리 키도록 계속? 즉 는 유효한 unique_ptr의 내용에 대한 포인터의 내용인가?

,

std::unique_ptr<A> a = ... 
A* a_ptr = a.get(); 
std::unique_ptr<A> a2 = std::move(a); 
// Does *a_ptr == *a2? 

나는 그것을하지 생각하지만, 나는 있는지 확인하려면.

(

+0

그 포인터 뒤에 객체는 파괴되지 않는다. 그리고 개체의 주소는 바꿀 수 없습니다. 따라서 주소는 유효해야합니다. – Columbo

+0

@drescherjm 아니, 이동 한 후, 최초의 unique_ptr은 아무것도 소유하지 않습니다. – juanchopanza

+0

지금 봅니다. 나는 실수로 a_ptr이 이동에 사용되었다고 생각했습니다. (이것은 나에게 의미가 없기 때문에주의 깊게 읽어야합니다.) – drescherjm

답변

3

단순히 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 
관련 문제