boost库在工作(6)作用域智能指针scoped_ptr之五
2013-02-05 20:58
453 查看
通过前面智能指针的学习,应了解到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来解决,如下例子:
scoped_ptr具体使用的例子如下:
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_ptr //软件开发人员: 蔡军生 2013-02-03 void 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); }
相关文章推荐
- boost库在工作(4)作用域智能指针scoped_ptr之三
- boost库在工作(5)作用域智能指针scoped_ptr之四
- boost库在工作(5)作用域智能指针scoped_ptr之四
- boost库在工作(2)作用域智能指针scoped_ptr之一
- boost库在工作(2)作用域智能指针scoped_ptr之一
- boost库在工作(6)作用域智能指针scoped_ptr之五
- boost库在工作(3)作用域智能指针scoped_ptr之二
- boost库在工作(3)作用域智能指针scoped_ptr之二
- boost库在工作(2)作用域智能指针scoped_ptr之一
- boost库在工作(4)作用域智能指针scoped_ptr之三
- boost库在工作(5)作用域智能指针scoped_ptr之四
- boost库在工作(4)作用域智能指针scoped_ptr之三
- boost库在工作(6)作用域智能指针scoped_ptr之五
- boost库在工作(3)作用域智能指针scoped_ptr之二
- [置顶] 从零开始学C++之boost库(一):详解 boost 库智能指针(scoped_ptr<T> 、shared_ptr<T> 、weak_ptr<T> 源码分析)
- boost库在工作(11)引用计数的智能指针weak_ptr
- boost库在工作(9)引用计数的智能指针shared_ptr之二
- boost库在工作(9)引用计数的智能指针shared_ptr之二
- Boost库中的智能指针scoped_ptr,scoped_array
- boost库在工作(11)引用计数的智能指针weak_ptr