제목과 동일. 이 질문에는 이미 답변이 있지만 아마 하나를 찾지 못했습니다.원시 포인터와 weak_ptr의 차이점은 무엇입니까?
답변
벌거 벗은 포인터와 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
원시 포인터는 (적어도 정상적으로) 단순히 주소입니다. 포인터 자체에서 을 가리키는 점에 대해서는 아무 것도 말할 수 없습니다.weak_ptr
항상 shared_ptr
와 연결되어, 그래서 우리는 아마 weak_ptr
의 감각을 만들기 위해 shared_ptr
로 시작해야합니다.
shared_ptr
은 참조 카운트되므로 객체에 대한 참조 (포인터)가 몇 개 있는지를 추적하고 해당 객체에 대한 참조가 더 이상 존재하지 않을 때 자동으로 객체를 파괴합니다.
이미 말했듯이 weak_ptr
은 shared_ptr
과 연결되어 있습니다. shared_ptr
과 달리 weak_ptr
의 존재는 이 아니며은 pointee 개체의 참조 횟수를 증가시킵니다. weak_ptr
을 사용하려면 먼저 shared_ptr
으로 변환해야합니다. 현재 참조 횟수가 양수이면 성공하고 및은 weak_ptr
을 shared_ptr
으로 변환하여 참조 포인터가 증가하므로 변환 된 포인터가 개체에 대한 "실제"참조임을 나타냅니다. 반면에 참조 횟수가 이미 0 인 경우 (즉, pointee 객체가 이미 파괴되었음을 의미) weak_ptr
을 shared_ptr
으로 변환하려는 시도는 실패합니다.
shared_ptr
은 pointee 개체의 공유 된 소유권을 의미합니다. pointee 개체는 해당 개체에 대한 적어도 하나의 shared_ptr이 존재하는 한 존재하게됩니다. 그러나 개체에 대한 마지막 shared_ptr
이 삭제 되 자마자 대상 개체도 삭제됩니다.
weak_ptr
은 pointee 개체에 대한 소유하지 않은 액세스를 의미합니다. 개체가 존재하면 액세스가 허용됩니다. 오브젝트가 파기 된 경우, 파기 된 오브젝트에 액세스하려고 시도하지 않고 pointee 오브젝트가 더 이상 존재하지 않는다고 알려줍니다.
당신은 weak_ptr를 점하는 경우 유효한 뭔가 확인할 수 있습니다. 원시 포인터로는 할 수 없습니다. – juanchopanza
[여기] (http://en.cppreference.com/w/cpp/memory/weak_ptr)를보고 모든 차이점을 직접 확인하는 것이 좋습니다. 단 하나의 차이점은 없습니다. – juanchopanza