C ++中的空和std :: shared_ptr有什么区别?

cplusplus.com shared_ptr页面调用了一个空的 std::shared_ptr和一个空的 shared_ptr之间的区别。 cppreference.com页面并没有显式调用这个区别,但是在std::shared_ptr行为的描述中同时使用了“empty”和与nullptr比较。

空的和空的shared_ptr有区别吗? 有没有这种混合行为指针的用例? 非空的shared_ptr是否有意义? 在正常的使用情况下(即,如果你没有明确地构造一个),在哪里可能会遇到空 – 但是非空的shared_ptr

如果您使用Boost版本而不是C ++ 11版本,那么这些答案中的任何一个都会改变吗?

这是shared_ptr行为的一个奇怪的angular落。 它有一个构造函数,它允许你创build一个拥有某个东西并指向其他东西的shared_ptr

 template< class Y > shared_ptr( const shared_ptr<Y>& r, T *ptr ); 

使用此构造函数构造的shared_ptrr 共享所有权 ,但指向任何ptr指向(即调用get()operator->()将返回ptr )。 这对于ptr指向r所拥有的对象的子对象(例如数据成员)的情况是很方便的。

你链接的页面调用一个shared_ptr ,它不拥有任何空的 ,一个shared_ptr指向什么都没有(即,它的get() == nullptr )为null 。 ( Empty在这个意义上被标准使用; null不是)。你可以构造一个null-but-not-empty的shared_ptr ,但是它不会很有用。 一个空的非空的shared_ptr本质上是一个非拥有指针,可以用来做一些奇怪的事情,比如将一个指针指向堆栈上的某个指针,指向一个期待shared_ptr的函数 (但是我build议你打它先将API放入API中)。

boost::shared_ptr也有这个构造函数 ,他们称之为别名构造函数

空的和空的shared_ptr有区别吗?

空的shared_ptr没有控制块,它的使用计数被认为是0.空的shared_ptr拷贝是另一个空的shared_ptr 。 它们都是独立的shared_ptr ,它们不共享通用控制块,因为它们没有共享控制块。 空的shared_ptr可以用默认的构造函数或带有nullptr构造函数构造。

非空的shared_ptr具有可以与其他shared_ptr共享的控制块。 复制非空的shared_ptrshared_ptr ,它与原始shared_ptr共享相同的控制块,所以使用count不为0. 可以说shared_ptr所有副本共享相同的nullptr 。 非空的shared_ptr可以用对象types的空指针(not 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