2013-05-26 6 views
15

제목과 동일. 이 질문에는 이미 답변이 있지만 아마 하나를 찾지 못했습니다.원시 포인터와 weak_ptr의 차이점은 무엇입니까?

+7

당신은 weak_ptr를 점하는 경우 유효한 뭔가 확인할 수 있습니다. 원시 포인터로는 할 수 없습니다. – juanchopanza

+1

[여기] (http://en.cppreference.com/w/cpp/memory/weak_ptr)를보고 모든 차이점을 직접 확인하는 것이 좋습니다. 단 하나의 차이점은 없습니다. – juanchopanza

답변

16

벌거 벗은 포인터와 weak_ptr 사이의 근본적인 개념 차이는 개체를 파괴하는 지적 경우, 벌거 벗은 포인터 그것에 대해 당신에게 말할 것입니다. 이를 매달린 포인터 (dangling pointer)라고합니다 : 존재하지 않는 객체에 대한 포인터. 그들은 일반적으로 추적하기가 어렵습니다.

weak_ptr됩니다. weak_ptr을 사용하려면 먼저 shared_ptr으로 변환해야합니다. 그리고 shared_ptr이 아무 것도 가리 키지 않으면 개체가 삭제되었습니다. 예를 들어

:

#include <iostream> 
#include <memory> 

std::weak_ptr<int> wp; 

void test() 
{ 
    auto spt = wp.lock(); // Has to be copied into a shared_ptr before usage 
    if (spt) { 
     std::cout << *spt << "\n"; 
    } else { 
     std::cout << "wp is expired\n"; 
    } 
} 

int main() 
{ 
    { 
     auto sp = std::make_shared<int>(42); 
     wp = sp; 
     test(); 
    } 
    test(); 
} 

출력

42 
wp is expired 
17

원시 포인터는 (적어도 정상적으로) 단순히 주소입니다. 포인터 자체에서 을 가리키는 점에 대해서는 아무 것도 말할 수 없습니다.weak_ptr

항상 shared_ptr와 연결되어, 그래서 우리는 아마 weak_ptr의 감각을 만들기 위해 shared_ptr로 시작해야합니다.

shared_ptr은 참조 카운트되므로 객체에 대한 참조 (포인터)가 몇 개 있는지를 추적하고 해당 객체에 대한 참조가 더 이상 존재하지 않을 때 자동으로 객체를 파괴합니다.

이미 말했듯이 weak_ptrshared_ptr과 연결되어 있습니다. shared_ptr과 달리 weak_ptr의 존재는 이 아니며은 pointee 개체의 참조 횟수를 증가시킵니다. weak_ptr을 사용하려면 먼저 shared_ptr으로 변환해야합니다. 현재 참조 횟수가 양수이면 성공하고 weak_ptrshared_ptr으로 변환하여 참조 포인터가 증가하므로 변환 된 포인터가 개체에 대한 "실제"참조임을 나타냅니다. 반면에 참조 횟수가 이미 0 인 경우 (즉, pointee 객체가 이미 파괴되었음을 의미) weak_ptrshared_ptr으로 변환하려는 시도는 실패합니다.

shared_ptr은 pointee 개체의 공유 된 소유권을 의미합니다. pointee 개체는 해당 개체에 대한 적어도 하나의 shared_ptr이 존재하는 한 존재하게됩니다. 그러나 개체에 대한 마지막 shared_ptr이 삭제 되 자마자 대상 개체도 삭제됩니다.

weak_ptr은 pointee 개체에 대한 소유하지 않은 액세스를 의미합니다. 개체가 존재하면 액세스가 허용됩니다. 오브젝트가 파기 된 경우, 파기 된 오브젝트에 액세스하려고 시도하지 않고 pointee 오브젝트가 더 이상 존재하지 않는다고 알려줍니다.