1、shared_ptr允许多个指针指向同一个对象(同一块内存空间),unique_ptr独占所指向的对象。
class A
{
public:
A(int a)
{
m_a = a;
}
private:
int m_a;
};
shared_ptr<A> p1 = std::make_shared<A>(10);
cout << "p1的count:" << p1.use_count() << endl;
shared_ptr<A> p2 = std::make_shared<A>(10); // p2重新分配新的内存地址,和p1指向的不是同一个对象,p1的引用计数仍为1
cout << "p1的count:" << p1.use_count() << endl;
shared_ptr<A> p3 = p1; // p3和p2指向同一块内存空间,指向同一个对象
cout << "p1的count:" << p1.use_count() << endl;
分别输出:
1
1
2
2、shared_ptr和unique_ptr都支持的操作:
shared_ptr<T> sp // 空智能指针,sp = nullptr
unique_ptr<T> up
p // 如果p指向一个对象,则为true
*p // 获得p指向的对象
p.get() // 返回普通指针
swap(p, q) // 交换p和q中的指针,交换p和q中保存的内存地址
3、shared_ptr的引用计数
如果shared_ptr指向的对象的引用计数变为0,shared_ptr的析构函数会销毁对象,并释放内存空间。
4、使用了动态生存期的资源的类(类里含有shared_ptr成员变量)
1种原因是需要在多个对象间共享数据;
使用动态内存的1个常见原因是允许在多个对象间共享相同的状态。
当我们拷贝、赋值、销毁一个类对象时,它的shared_ptr成员也会被拷贝、赋值和销毁。
5、unique_ptr特性
某个时刻只能有一个unique_ptr指向一个对象,unique_ptr不支持普通的拷贝和赋值操作。
6、unique_ptr支持的操作
unique_ptr<T> u1; // 一个空指针
u = nullptr // 释放u指向的对象,将u置为空
u.release(); // 为了转移所有权。返回指向内存的普通指针,并将u置为空
u.reset(); // 释放u指向的对象
u.reset(q); // 令u指向q指向的对象,否则u置空