boost - 智能指针总结

shared_ptr

常用接口

use_count() : 获得引用计数数量。

get() : 获得原始指针。

reset() : 指向NULL内存。

注意事项

1. 不能直接赋值NULL,编译无法通过;如果需要清空使用reset();reset后,ptr指向NULL内存。

2. 不能手动释放内存,如delete ptr.get(),这将会出现内存错误,至于为什么,目前还不清楚

3. 先分配内存,再交给智能指针,再释放也不可以,如
    int * c = new int;
    boost::shared_ptr<int> pObj(c);
    delete c;

    会出现内存错误,boost是怎么防止用户在外面delete c的呢?


weak_ptr

是执行弱引用的智能指针。当你需要它的时候就可以使用一个强(共享)指针指向它(当对象被释放的时候,它为空),当然这个强指针在使用完毕应该立即释放掉

struct CBetterChild : public CSample
{
  weak_ptr<CDad> myDad;
  void BringBeer()
  {
    shared_ptr<CDad> strongDad = myDad.lock(); // request a strong pointer
    if (strongDad)                      // is the object still alive?
      strongDad->SetBeer();
    // strongDad is released when it goes out of scope.
    // the object retains the weak pointer
  }
};

注意事项

1. 弱引用如果需要操作类对象,需要转为强引用,通过lock接口获得

2. 获得强引用后,需要检测对象是否为空,因为有可能对象已经释放

3. 操作完毕后,强引用应该马上释放,也就是强引用最好是临时局部变量


常用接口

lock() : 转为强引用,如果对象已经释放,则返回空的强引用

expired(): 判断对象是否已经释放



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值