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());