智能指针

shared_ptr 和 unique_ptr

shared_ptr unique_ptr
初始化 ①shared_ptr<T>sp;
sp.reset(new T());
②shared_ptr<T> sp(new T());
③shared_ptr<T> sp1 = sp; //拷贝构造
④auto sp = make_shared<int>(10);
①unique_ptr<T> up;
up.reset(new T());
②unique_ptr<T> up(new T() );
③unique_ptr<T> up1 = std::move(up); //移动构造,因为unique_ptr是move-only
④auto up = make_unique<int>(10);
两者的构造函数将声明为explicit,即不允许隐式类型转换,如shared_ptr<int> sp = new int(10) //错误
shared_ptr<int> sp(new int(10)) //正确
第一句是拷贝构造函数,一般拷贝构造都要传入与其类型相同的变量引用。内置指针无法隐式转换为shared_ptr所以报错。
第二局显式调用了shared_ptr的构造函数,正常传入内置指针。
条件判断 if(sp){…} if(up){…} 二者均重载operator bool()
解引用 *sp *up 获得所指的对象
->mem sp->mem,等价于(*sp).mem up->mem,等价于(*up).mem ->主要用于类类型的指针访问类的成员
.主要用于类类型的对象访问类的成员
get() sp.get() up.get() 返回p中保存的指针。小心使用,若智能指针释放了其对象,返回的指针所指向的对象也就消失了。
p.swap(q) swap(p,q)
p.swap(q)
swap(p,q)
p.swap(q)
交换p和q中的指针
独有操作 ①shared_ptr<T> p1(p); //拷贝构造
②p=q; //赋值
③p.unique(); //若p.use_count();为1,返回true,否则返回false.
④p.use_count(); //返回强引用计数。
①up = nullptr; //释放up指向的对象,并将up置空
②up.release(); //up放弃对指针的控制权,返回裸指针,并将up置空。
③up.reset(); //置空up
up.reset(p); // p为裸指针,将up指向p;
③up.reset(nullptr); // 置空up
①unique_ptr为move-only,不可拷贝和赋值,可以被移动。
②release()会切断一个unique_ptr和它原来管理的对象之间的联系。通常用来初始化一个智能指针。