cplusplus.com shared_ptr
page指出空std::shared_ptr
和空shared_ptr
之间的区别。 cppreference.com page并未明确指出区别,但在nullptr
行为描述中同时使用了“空”和与std::shared_ptr
的比较。
空shared_ptr
和空shared_ptr
之间有区别吗?这种混合行为指针有什么用例?非空的shared_ptr
甚至有意义吗?正常使用情况下(即如果您没有明确构造一个)会以空但非空的ojit_code结尾吗?
如果您使用的是Boost版本而不是C++ 11版本,这些答案是否会改变?
最佳答案
这是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
)为空。 (标准从这个意义上说,使用Empty;不使用null。)您可以构造一个null但不为空的shared_ptr
,但它不是很有用。空但不为空的shared_ptr
本质上是一个没有所有权的指针,可以用来做一些奇怪的事情,例如passing a pointer to something allocated on the stack to a function expecting a shared_ptr
(但我建议您先打孔谁先将shared_ptr
放到API内)。boost::shared_ptr
也称为has this constructor,它们称为别名构造函数。