本文共 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/