shared_ptr
shared_ptr 使用计数机制来表明资源被几个指针共享。可以通过成员函数use_count()来查看资源的所有者个数。除了可以通过new来构造,还可以通过传入auto_ptr, unique_ptr,weak_ptr来构造。当我们调用release()时,当前指针会释放资源所有权,引用计数减一。当引用计数等于0时,资源会被释放。
shared_ptr和unique_ptr都支持的操作:
- //空智能指针
shared_ptr<T> sp;
unique_ptr up;- p //将p作为一个条件判断,如果p指向一个对象,则为true
- *p //解引用p,获得它指向的对象。
- p->mem //等价于(*p).mem
- p.get(); // 返回p中保存的指针。要小心使用,若智能指针释放了其对象,返回的指针所指向的对象也就消失了。
- swap(p,q); 、p.swap(q); //交换p和q中的指针。
shared_ptr独有的操作:
- make_shared<T>(args);// 返回一个shared_ptr,指向一个动态分配的类型为T的对象。使用args初始化此对象。
- shared_ptr<T>p(q); // p是shared_ptr的拷贝;此操作会递增q中的计数器。q中的指针必须能转换成T*
- p = q;// p和q都是shared_ptr,所保存的指针必须能相互转换。此操作会递减p的引用计数,递增q的引用计数;若p的引用计数变为0,则将其管理的原内存释放。
- p.unique();// 若p.use_count()为1,返回true;否则返回false。
- p.use_count(); // 返回与p共享对象的只能指针数量;可能很慢,主要用于调试。
定义和改变shared_ptr的方法
- shared_ptr<T> p(q); //p管理内置指针q所指向的对象;q必须指向new分配的内存,且能够转换为T*类型。
- 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(); // 若p是唯一指向其对象的shared_ptr,reset会释放此对象。–同unique_ptr。
- p.reset(q); //若传递了可选了参数内置指针q,会令p指向q,否则会将p置为空。–同unique_ptr。
- p.reset(q, d); //若还传递了参数d,将会调用d而不是delete来释放q。
错误的用法:
把指针单独定义出来,用同一个指针构造多个智能指针,会造成当一个智能指针析构时,另一个智能指针管理的内部指针被释放,程序崩溃。
void foo()
{
int *p = new int