合理使用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);