博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
boost库在工作(9)引用计数的智能指针shared_ptr之二
阅读量:4162 次
发布时间:2019-05-26

本文共 1532 字,大约阅读时间需要 5 分钟。

接着下来,需要演示一下怎么样在多个对象里共享一个对象,而不管每个对象的生命周期,就可以及时地把使用的对象在合适地方删除。下面的例子里先定义两个类,然后每个类都引用共享的对象,接着使用完成后,就会在析构函数里删除,可以从例子程序运行的输出结果看到内部运行的生命周期。有了共享智能指针,面对多个对象共享使用一个对象,这样的管理会方便很多。具体代码如下:

//在两个对象之间共享使用shared_ptrclass CObjA{public:	CObjA(boost::shared_ptr< int > pA)		:m_pA(pA)	{	}	~CObjA()	{		std::cout << "m_pA.use_count() :" << m_pA.use_count() << std::endl;	}	void Print(void)	{		std::cout << "A Print = " << *m_pA << std::endl;	}private:	boost::shared_ptr< int > m_pA;};class CObjB{public:	CObjB(boost::shared_ptr< int > pB)		:m_pB(pB)	{	}	~CObjB()	{		std::cout << "m_pB.use_count() :" << m_pB.use_count() << std::endl;	}	void Print(void)	{		*m_pB += 100;		std::cout << "B Print = " << *m_pB << std::endl;	}private:	boost::shared_ptr< int > m_pB;};void TestObj(void){	//创建一个共享指针。	boost::shared_ptr< int > pObj(new int);	*pObj = 10;	//传给两个对象使用。	CObjA objA(pObj);	CObjB objB(pObj);	objA.Print();	objB.Print();	//	CObjA* pObjA = new CObjA(pObj);	pObjA->Print();	delete pObjA;	//赋值操作。	boost::shared_ptr< int > pLast = pObj;	std::cout << "pLast.use_count() :" << pLast.use_count() << std::endl;	//比较操作	if (pLast == pObj)	{		std::cout << "pLast == pObj" << std::endl;	}}

例子运行的结果如下:

100

A Print = 10

B Print = 110

A Print = 110

m_pA.use_count() :4

pLast.use_count() :4

pLast == pObj

m_pB.use_count() :3

m_pA.use_count() :2

请按任意键继续. . .

 

从上面的例子看到,可以使用函数use_count()来查看引用计数,这样方便调试和做单元测试,以及自动化测试。不过,在使用智能指针shared_ptr时,需要注意下面几个问题:

1. 不要让智能指针构造循环引用的情况,否则引用计数的技术就会失效,导致内存对象不能删除。

2. 不要让智能指针构造没有名字的临时对象。

3. 如果有多个线程的情况下,需要加锁对智能指针进行赋值和删除。如果只是读取智能指针的对象,是没有任何问题。

转载地址:http://iaixi.baihongyu.com/

你可能感兴趣的文章
centos打开ftp服务
查看>>
Linux tty/pty/pts 概念区别
查看>>
制作本地DVD yum源
查看>>
告别2009
查看>>
CentOS/Redhat/Fedora各类密码破解
查看>>
系统引导管理器GRUB
查看>>
Grub丢失-------用安装盘来修复GRUB
查看>>
String s=new String("abc")创建了几个对象?
查看>>
Java 反射机制
查看>>
Java序列化与反序列化
查看>>
Mysql性能优化
查看>>
数据库性能优化
查看>>
数据库性能优化之冗余字段的作用
查看>>
制约网站性能的是数据库,那么制约数据库性能的提升是什么?
查看>>
SQL 查询优化
查看>>
ftp命令大全
查看>>
windows运行对话框命令大全
查看>>
ftp站点收录
查看>>
常用网络命令
查看>>
Hadoop Map/Reduce教程
查看>>