intrusive_ptr
intrusive_ptr是一种引用计数型智能指针,与之前介绍的scoped_ptr、shared_ptr不同,需要额外增加一些的代码才能使用。
如果现存代码已经有了引用计数机制管理的对象,那么intrusive_ptr是一个非常好的选择,可以包装已有对象从而得到与shared_ptr类似的智能指针。
因为他是引用计数类型指针,所以接口与shared_ptr很像,也可以支持static_pointer_cast()、dynamic_pointer_cast()等转型操作,但它自己不直接管理引用计数,而是调用下面两个函数间接管理。
//增加引用计数
void intrusive_ptr_add_ref(T *p);
//减少引用计数
void intrusive_ptr_release(T *p);
intrusive_ptr的构造函数和reset()还多出一个add_ref参数,表示是否增加引用计数,如果add_ref == true,那么它就相当于weak_ptr,只是简单地观察对象。
用法:
#include <iostream>
#include <boost/smart_ptr.hpp>
using namespace boost;
//自己定义实现引用计数的类
struct counted_data
{
//引用计数
int m_count = 0;
};
int main()
{
typedef intrusive_ptr<counted_data> counted_ptr;
//创建智能指针
counted_ptr p(new counted_data);
assert(p);
//使用operator->操作符
assert(p->m_count == 1);
//指针拷贝构造
counted_ptr p2(p);
//引用计数增加
assert(p->m_count == 2);
//弱引用
counted_ptr weak_p(p.get(), false);
//引用计数不增加
assert(weak_p->m_count == 2);
//复位指针
p2.reset();
//p2不持有指针
assert(!p2);
//引用计数减少
assert(p->m_count == 1);
getchar();
return 0;
}
注意:下面这两个函数的实现需要放在所在的名字空间或者boost名字空间。
void intrusive_ptr_add_ref(counted_data *p)
{
++p->m_count;
}
void intrusive_ptr_release(counted_data *p)
{
if (--p->m_count == 0)
{
delete p;
}
}
引用计数器
为了简化实现引用计数的工作,intrusive_ptr定义了一个辅助类intrusive_ref_counter,声明如下:
用法:
#include <iostream>
#include <boost/smart_ptr.hpp>
#include <boost/smart_ptr/intrusive_ref_counter.hpp>
using namespace boost;
//自己定义实现引用计数的类
struct counted_data : public intrusive_ref_counter<counted_data>
{
//引用计数
int m_count = 0;
};
int main()
{
typedef intrusive_ptr<counted_data> counted_ptr;
//创建智能指针
counted_ptr p(new counted_data);
assert(p);
//使用operator->操作符
assert(p->m_count == 1);
getchar();
return 0;
}