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

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

通过前面智能指针的学习,应了解到std::auto_ptr的使用和局限性,从而引发boost库针对这些情况提供了更多的智能指针,其中scoped_ptr就是针对std::auto_ptr的而提供的。对开发人员来说,代码限制得越精确,编译器发现尽可能多的错误,就是越好的方式。比如想要某个变量不能改变它的值,就需要常量限定符,这样就可以杜绝任何不小心对变量的操作。在普通的指针里,也常常使用const来限定指针不能指向别的指针。如果需要一个指针既不能指向别的指针,又可以自动删除的智能指针,这样怎么办呢?可以使用下面的方案来解决吗?代码如下:

const std::auto_ptr< int > pTemp1(new int);

这样指针pTemp1常量的,不能指向别的指针,也是一个智能指针。通过这样的方案是可以解决的,但解决起来不是很优美,比如需要写const,导致输入比较长;也没有灵活性,比如又想更换智能指针指向情况,这种方法就不行了。

 

那还有没有更好的解决方案呢?当然是有的,就是使用scoped_ptr,它是作用域指针,并且不能被拷贝、被赋值,但可以通过函数reset来重新指向新的指针。scoped_ptr与std::auto_ptr的主要区别,就是保存的指针是否可以转移控制权。std::auto_ptr是支持转移控制权,而scoped_ptr不支持。当你编写代码时,不想别人拿走你的指针,就可以使用scoped_ptr来实现,保证只有一个指针指向分配的内存,同时也不让别的指针把它覆盖了。当你在一个类里声明一个指针,又在构造函数之前初始化列表里分配了内存,但在构造函数里又抛出一个异常,这样就会导致内存泄漏,这时需要使用scoped_ptr来解决,如下例子:

//class CScopedTest{public:	CScopedTest()		:m_pTest(new int) //如果这里不使用智能指针,可能会有内存泄漏。	{		//这里可能异常抛出。	}private:	boost::scoped_ptr< int > m_pTest;};
scoped_ptr具体使用的例子如下:

//使用scoped_ptrvoid TestScopedPtr(void){	//定义变量	boost::scoped_ptr< int > pVal(new int);	if (pVal)	{		*pVal = 1000;	}		std::cout<< *pVal << std::endl;	//下面这行赋值编译会出错。	//boost::scoped_ptr< int > pTemp = pVal;	boost::scoped_ptr< int > pTemp;	//下面这行判断编译会出错	//if (pTemp == pVal)	//{	//}		//这行与boost::scoped_ptr类似	const std::auto_ptr< int > pTemp1(new int);		//重置指针。	pVal.reset(new int);}

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

你可能感兴趣的文章
重写strcpy() 函数原型
查看>>
sizeof的用法(附strlen函数)
查看>>
C 面试题之找错题
查看>>
计算机专业必看书籍
查看>>
计算机专业经典书籍
查看>>
C++书籍汇总
查看>>
安装wine出现的问题与解决
查看>>
JAVA(一)
查看>>
JAVA(二)
查看>>
JAVA(五)
查看>>
JAVA(三)
查看>>
JAVA(四)
查看>>
Redhat linux 中VMware Tools 的安装
查看>>
李开复给学习计算机的学生的7点建议
查看>>
数据库内连接、左连接、右连接 ,全连接
查看>>
OpenSuse常用命令操作笔记
查看>>
敏捷开发中编写高质量Java代码
查看>>
IBM WebSphere云平台首席架构师谈中间件和云计算
查看>>
IBM部门介绍:研发部(R&D)【CDL、CRL、CSTL】
查看>>
IBM部门简称
查看>>