C ++에서 비어있는 std :: shared_ptr의 차이점은 무엇입니까?
cplusplus.com의 shared_ptr
페이지는 구별 부른다 빈 std::shared_ptr
과 널을 shared_ptr
. cppreference.com 페이지 를 명시 적으로 모두 "빈"와 비교 차이를 불러하지만, 사용하지 않는 nullptr
자사의 설명에 std::shared_ptr
행동.
비어있는 것과 널 사이에 차이점이 shared_ptr
있습니까? 이러한 혼합 동작 포인터에 대한 사용 사례가 있습니까? 비어 있지 않은 null shared_ptr
이 의미가 있습니까? 정상적인 사용에서 (즉, 명시 적으로 구성하지 않은 경우) 비어 있지만 null이 아닌 경우가 발생할 수 shared_ptr
있습니까?
C ++ 11 버전 대신 Boost 버전을 사용하는 경우 이러한 답변이 변경됩니까?
이상한 shared_ptr
행동 구석입니다 . 그것은 당신이 할 수있는 생성자가 shared_ptr
그 소유 뭔가 를 가리키는 다른 뭔가를 :
template< class Y >
shared_ptr( const shared_ptr<Y>& r, T *ptr );
shared_ptr
이 생성자 사용하여 구성 주식 소유권 과를 r
하지만, 포인트 어떤 ptr
포인트 (즉, 호출 get()
또는 operator->()
반환합니다 ptr
). 이것은에서 ptr
소유 한 객체의 하위 객체 (예 : 데이터 멤버)를 가리키는 경우에 편리합니다 r
.
페이지 당신은 전화 연결 shared_ptr
아무것도 소유하지 않습니다 빈을 하고, shared_ptr
그 아무것도 포인트 (즉, 누구의 get() == nullptr
) 널 (null) . ( 이 의미에서 Empty 는 표준에서 사용됩니다. null 은 그렇지 않습니다.) null-but-not-empty를 생성 할 수 shared_ptr
있지만 그다지 유용하지는 않습니다. 빈-만 아니라 널은 shared_ptr
본질적으로 같은 몇 가지 이상한 일을하는 데 사용할 수있는 비 소유 포인터이며, A는 기대 함수에 스택에 할당 무언가에 대한 포인터를 전달하는shared_ptr
(하지만 넣어 누구든지 펀칭 좋을 것 shared_ptr
내부를 먼저 API).
boost::shared_ptr
또한 이 생성자가 그들이 전화 앨리어싱 생성자를 .
비어있는 것과 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
'Programing' 카테고리의 다른 글
Vim은 Python 주석의 들여 쓰기를 자동으로 제거합니다. (0) | 2020.10.20 |
---|---|
큰 스위치 문 : 잘못된 OOP? (0) | 2020.10.20 |
jquery에서 추가와 반대 (0) | 2020.10.19 |
루프에서 await를 사용하는 방법 (0) | 2020.10.19 |
AngularJs에 숨겨진 가시성? (0) | 2020.10.19 |