智能指针是一个类模板
经过实例化后,智能指针就和普通类没有什么区别。
- 构造函数
默认构造shared_ptr<T> sp
和unique_ptr<T> up
指针构造shared_ptr<T> sp(T *)
和unique_ptr<T> up(T *)
,这里默认为explicit
带删除器的构造shared_ptr<T> p(q,d)
q
这里可以内置指针和智能指针,同时将用d
析构器代替delete
- 拷贝构造
注意到指针构造函数被声明为explicit
,意味着我们删除了指针形式的任何拷贝构造函数。
shared_ptr<T> sp=new T;
unique_ptr<T> up=new T;//不允许,指针形式的隐式构造被禁止
shared_ptr<T> sp1(sp2);//ok,没有发生隐式转换
unique_ptr<T> up1(up2);//not ok,没有拷贝构造
- 赋值操作
sp1=sp2;
up1=up2;//deleted funciton,not ok
-
解引用操作
*sp
*up
-
get()方法
p.get()
返回一个与智能指针指向相同的内置指针
reset()
方法
reset有多个重载形式,分别是p.reset()
p.reset(q)
p.reset(q,d)
,作用是将一个智能指针重置为内置空指针(或q
指针)
-
->mem
操作
指针指针指向对象中的成员 -
指针交换操作
swap(p,q) p.swap(q)
完成指针指向对象的交换
定义了智能指针到bool
的隐式转换
sp
和up
在作为条件时都会被隐式转换为bool
型
作为共享指针的一些特殊成员
- p.use_count() p指向对象对应的引用计数
- p.unique() 对象是否只有一个引用计数
make_shared最安全的分配方法[1]
shared_ptr<T> sp=make_shared<T>(args)
[1]相对于直接使用指针来进行构造