Boost库基础-智能指针(intrusive_ptr)

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;
}

猜你喜欢

转载自blog.csdn.net/wzz953200463/article/details/105058883