boost库在工作(6)作用域智能指针scoped_ptr之五

来源:互联网 发布:麻将源码 net unity 编辑:程序博客网 时间:2024/06/06 04:35

通过前面智能指针的学习,应了解到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);}


原创粉丝点击