R.M*_*.M. 75 c++ shared-ptr c++11
该cplusplus.com shared_ptr
页面召唤出一个区分空 std::shared_ptr
和空 shared_ptr
.该cppreference.com页面没有明确叫出区别,但同时使用"空",并比较nullptr
其描述std::shared_ptr
行为.
空和空之间有区别shared_ptr
吗?这种混合行为指针有用例吗?非空null是否shared_ptr
有意义?是否会出现正常使用情况(即如果你没有明确构造一个),你最终会得到一个空但非空的shared_ptr
?
如果您使用的是Boost版本而不是C++ 11版本,那么这些答案中的任何一个都会改变吗?
T.C*_*.C. 77
这是一个奇怪的shared_ptr
行为角落.它有一个构造函数,可以让你做出shared_ptr
该拥有的东西,点别的东西:
template< class Y >
shared_ptr( const shared_ptr<Y>& r, T *ptr );
Run Code Online (Sandbox Code Playgroud)
在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
(但是我建议打击任何放在shared_ptr
里面的人API首先).
boost::shared_ptr
也有这个构造函数,他们称之为别名构造函数.
空和shared_ptr之间有区别吗?
Empty shared_ptr
没有控制块,其使用计数被认为是0.复制空shared_ptr
是另一个空shared_ptr
.它们都是独立shared_ptr
的,不共享公共控制块,因为它们没有它.shared_ptr
可以使用默认构造函数或使用构造函数构造Empty nullptr
.
非空null shared_ptr
具有可与其他shared_ptr
s 共享的控制块.非空null的副本shared_ptr
是shared_ptr
与原始共享相同的控制块,shared_ptr
因此使用计数不为0. 可以说所有副本的shared_ptr
共享相同nullptr
.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;
}
Run Code Online (Sandbox Code Playgroud)
它输出:
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
Run Code Online (Sandbox Code Playgroud)
http://coliru.stacked-crooked.com/a/54f59730905ed2ff
归档时间: |
|
查看次数: |
13590 次 |
最近记录: |