Boost库系列:智能指针

合理使用boost智能指针,直接内存释放问题,你只管new,不需考虑delete,甚至new也不用你new(例如由make_shared函数返回shared_ptr智能指针)。

1、头文件

<boost/smart_ptr.hpp>(智能指针头文件)

<boost/smart_ptr/make_unique.hpp> (使用make_unique()函数用到 )

<boost/smart_ptr/owner_less.hpp> (使用owner_less所有权比较函数对象时用到)

2、指针类别

boost.smart_ptr库提供6中智能指针

(1)scoped_ptr:只能在本作用域内使用的智能指针,不能被拷贝,也就是说申请内存之后,直到作用域结束自动释放之前,它唯一拥有这块内存。当然在作用域结束之前,可以手动reset()进行指针重置清空。get()返回底层原始指针。

(2)scoped_array:scoped_ptr的数组版本。

(3)shared_ptr:最有价值的智能指针。共享指针(早期起名为counted_ptr),内部通过记录指针被引用的计数,刚初始申请到内存时计数use_count返回为1(unique()返回true),当被赋值给另一个指针变量时,计数增加1,当一个指向它的智能指针作用域结束时,计数减1,当计数变为0时,说明引用它的所有指针作用均已结束,会自动释放该内存。

class A{};
class B
{
public:
    B(A a,int i);
};
void main()
{
    shared_ptr<A> p0 = shared_ptr<A>(new A);
    shared_ptr<A> p1(new A);
    assert(p1.unique());
    shared_ptr<B> p2 = make_shared<B>(p1.get(),2);//make_shared工厂函数
    assert(p2.use_count()==1);
    assert(p1.use_count()==1);
    A* p3=p1.get();//获取原始指针,计数不增加
    assert(p1.use_count()==1);
    auto p4=p1;//计数增加
    assert(p1.use_count()==2);
}

(4)shared_array:shared_ptr的数组版本

(5)weak_ptr:弱指针,与shared_ptr相比,复制不会产生引用计数。lock()返回shared_ptr,并会产生引用计数。

(6)intrusive_ptr:

3、指针类型转换函数

shared_ptr指针不能通过诸如static_cast<T*>(p.get())这种形式获取原始指针之后进行转型,否则操作之后不能再被shared_ptr进行正确的管理。正确的用法应该是这样:

shared_ptr<std::exception> p1(new bad_exception);
auto p2 = dynamic_pointer_cast<bad_exception>(p1);
auto p3 = static__pointer_cast<std::exception>(p2);
assert(p3==p1);
assert(p1.use_count()==3);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值