空shared_ptr和空shared_ptr之间有区别吗?
空shared_ptr
没有控制块,其使用计数被认为是0。空副本shared_ptr
是另一个空shared_ptr
。它们都是独立shared_ptr
的,不共享公共控制块,因为它们没有共享控制块。shared_ptr
可以使用默认构造函数或采用的构造函数来构造Empty nullptr
。
非空nullshared_ptr
具有可与其他共享的控制块shared_ptr
。非空null的副本shared_ptr
是shared_ptr
与原始副本共享相同的控制块,shared_ptr
因此使用计数不为0。可以说所有副本均shared_ptr
共享相同nullptr
。非空nullshared_ptr
可以使用对象类型(不是nullptr
)的null指针构造
这是示例:
#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
shared_ptr
使用非NULL存储的指针创建空实例。” 同样值得一提的是前面的注释(p15),“为避免指针悬空的可能性,此构造函数的用户必须确保p
至少在r
销毁所有权之前,该保持有效。” 确实很少使用的构造。