C++新特性(六)- shared_ptr

shared_ptr

shared_ptr 使用计数机制来表明资源被几个指针共享。可以通过成员函数use_count()来查看资源的所有者个数。除了可以通过new来构造,还可以通过传入auto_ptr, unique_ptr,weak_ptr来构造。当我们调用release()时,当前指针会释放资源所有权,引用计数减一。当引用计数等于0时,资源会被释放。

shared_ptr和unique_ptr都支持的操作:

  1. //空智能指针
    shared_ptr<T> sp;
    unique_ptr up;
  2. p //将p作为一个条件判断,如果p指向一个对象,则为true
  3. *p //解引用p,获得它指向的对象。
  4. p->mem //等价于(*p).mem
  5. p.get(); // 返回p中保存的指针。要小心使用,若智能指针释放了其对象,返回的指针所指向的对象也就消失了。
  6. swap(p,q); 、p.swap(q); //交换p和q中的指针。

shared_ptr独有的操作:

  1. make_shared<T>(args);// 返回一个shared_ptr,指向一个动态分配的类型为T的对象。使用args初始化此对象。
  2. shared_ptr<T>p(q); // p是shared_ptr的拷贝;此操作会递增q中的计数器。q中的指针必须能转换成T*
  3. p = q;// p和q都是shared_ptr,所保存的指针必须能相互转换。此操作会递减p的引用计数,递增q的引用计数;若p的引用计数变为0,则将其管理的原内存释放。
  4. p.unique();// 若p.use_count()为1,返回true;否则返回false。
  5. p.use_count(); // 返回与p共享对象的只能指针数量;可能很慢,主要用于调试。

定义和改变shared_ptr的方法

  1. shared_ptr<T> p(q); //p管理内置指针q所指向的对象;q必须指向new分配的内存,且能够转换为T*类型。
  2. shared_ptr<T>p(u); //p从unique_ptr u那里接管了对象的所有权;将u置为空。
  3. shared_ptr<T>p(q, d);// p接管了内置指针q所指向的对象的所有权。q必须能够转换为T*类型。p将使用可调用对象d来代替delete。
  4. shared_ptr<T>p(p2, d);// p是shared_ptr p2的拷贝,唯一的区别是p将用可调用对象d来代替delete。
  5. p.reset(); // 若p是唯一指向其对象的shared_ptr,reset会释放此对象。–同unique_ptr。
  6. p.reset(q); //若传递了可选了参数内置指针q,会令p指向q,否则会将p置为空。–同unique_ptr。
  7. p.reset(q, d); //若还传递了参数d,将会调用d而不是delete来释放q。

错误的用法:

把指针单独定义出来,用同一个指针构造多个智能指针,会造成当一个智能指针析构时,另一个智能指针管理的内部指针被释放,程序崩溃。

void foo()
{
   
    int *p = new int
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值