비어있는 것과 null shared_ptr 사이에 차이점이 있습니까?
Empty shared_ptr
에는 제어 블록이 없으며 사용 횟수는 0으로 간주됩니다 . empty의 복사본 shared_ptr
은 또 다른 비어 shared_ptr
있습니다. 둘 다 shared_ptr
공통 제어 블록이 없기 때문에 공유하지 않는 별도 의 s입니다. Empty shared_ptr
는 기본 생성자 또는 nullptr
.
비어 있지 않은 null shared_ptr
에는 다른 shared_ptr
s 와 공유 할 수있는 제어 블록이 있습니다 . 비어 있지 않은 널 (null)의 복사 shared_ptr
입니다 shared_ptr
원본과 동일한 제어 블록이 주 shared_ptr
때문에 사용 횟수가 0이되지 않습니다 그것은 그 모든 사본라고 할 수 shared_ptr
주 같은nullptr
. 비어 있지 않은 null shared_ptr
은 객체 유형의 null 포인터 (아님 nullptr
) 로 생성 할 수 있습니다.
예를 들면 다음과 같습니다.
#include <iostream>
#include <memory>
int main()
{
std::cout << "std::shared_ptr<int> ptr1:" << std::endl;
{
std::shared_ptr<int> ptr1;
std::cout << "\tuse count before copying ptr: " << ptr1.use_count() << std::endl;
std::shared_ptr<int> ptr2 = ptr1;
std::cout << "\tuse count after copying ptr: " << ptr1.use_count() << std::endl;
std::cout << "\tptr1 is " << (ptr1 ? "not null" : "null") << std::endl;
}
std::cout << std::endl;
std::cout << "std::shared_ptr<int> ptr1(nullptr):" << std::endl;
{
std::shared_ptr<int> ptr1(nullptr);
std::cout << "\tuse count before copying ptr: " << ptr1.use_count() << std::endl;
std::shared_ptr<int> ptr2 = ptr1;
std::cout << "\tuse count after copying ptr: " << ptr1.use_count() << std::endl;
std::cout << "\tptr1 is " << (ptr1 ? "not null" : "null") << std::endl;
}
std::cout << std::endl;
std::cout << "std::shared_ptr<int> ptr1(static_cast<int*>(nullptr))" << std::endl;
{
std::shared_ptr<int> ptr1(static_cast<int*>(nullptr));
std::cout << "\tuse count before copying ptr: " << ptr1.use_count() << std::endl;
std::shared_ptr<int> ptr2 = ptr1;
std::cout << "\tuse count after copying ptr: " << ptr1.use_count() << std::endl;
std::cout << "\tptr1 is " << (ptr1 ? "not null" : "null") << std::endl;
}
std::cout << std::endl;
return 0;
}
다음을 출력합니다.
std::shared_ptr<int> ptr1:
use count before copying ptr: 0
use count after copying ptr: 0
ptr1 is null
std::shared_ptr<int> ptr1(nullptr):
use count before copying ptr: 0
use count after copying ptr: 0
ptr1 is null
std::shared_ptr<int> ptr1(static_cast<int*>(nullptr))
use count before copying ptr: 1
use count after copying ptr: 2
ptr1 is null
http://coliru.stacked-crooked.com/a/54f59730905ed2ff
shared_ptr
NULL이 아닌 저장된 포인터 로 빈 인스턴스를 생성 할 수 있습니다 ." 또한 앞의 참고 (p15), "포인터가 매달릴 가능성을 피하기 위해이 생성자의 사용자p
는 소유권 그룹r
이 소멸 될 때까지 유효한 상태 를 유지 해야합니다."라고 언급 할 가치가 있습니다 . 실제로 거의 사용되지 않는 구조.