智能指针
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和它原来管理的对象之间的联系。通常用来初始化一个智能指针。 |