C++笔记 智能指针 shared_ptr unique_ptr weak_ptr

时间:2021-02-14 19:44:47

shared_ptr和unique_ptr都支持的操作://省略了一部分

p.get()  //返回保存的指针,要小心使用,若智能指针释放了其对象,返回的指针指向的对象也就消失了

swap(p,q);  p.swap(q);  //等价


shared_ptr独有的操作(部分):

make_shared<T>(args)  //返回一个shared_ptr,指向一个动态分配的类型为T的对象。使用args初始化此对象

p=q;  //使p的引用计数减1,递增q的引用计数

p.unique();  //若p.use_count()为1,返回true

p.use_count();  //返回与p共享对象的智能指针的数量,可能很慢,主要用于调试


shared_ptr部分其他操作:

shared_ptr<T> p(u);  //p从unique_ptr  u那里接管了对象的所有权;将u置为空

shared_ptr<T> p(q,d);  //p接管了内置指针q所指向对象的所有权。q必须能转化为T*类型。p将使用可调用对象d来代替delete

shared_ptr<T> p(p2,d);  //p是shared_ptr  p2的拷贝。唯一区别是p将使用可调用对象d来代替delete

p.reset();  //字面意思,reset为括号里的参数;d为可调用对象,来代替delete

p.reset(q);

p.reset(q,d);


unique_ptr部分其他操作:

u.release();  //释放控制权,返回指针,u置空。注意此处没有释放,要记得delete(返回的指针);

u.reset();  //同上

u.reset(q);

u.reset(nullptr);


不要混合使用普通指针和智能指针

不要用get初始化另一个智能指针或为另一个智能指针赋值

发生异常shared_ptr也会正常释放资源


weak_ptr:

w.use_count();

w.expired();  //若w.use_count();返回0,为true

w.lock();  //若w.expired();为true,返回一个空的shared_ptr,否则返回一个指向w的对象的shared_ptr

不能*w直接访问,必须 int k = *(w.lock());