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_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
本质上是一个非拥有指针,可以用来做一些奇怪的事情,比如将一个指针指向堆栈上的某个指针,指向一个期待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_ptr
是shared_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