boost库在工作(5)作用域智能指针scoped_ptr之四
2013-02-04 21:58
260 查看
第二种情况,主要就是使用在调用异常抛出的函数的地方。如下面的例子:
在这个例子里,当函数TestCallThrow调用一个有异常抛出函数ThrowFun时,如果没有使用智能指针,就比较麻烦了,那么就必须先捕捉这个异常输出,在异常里再添加一个删除内存的操作。如果调用函数比较多,层次比较多,就需要更多的捕捉异常了,这样导致代码也比较难理解,容易出错。
在异常处理里,智能指针作为一个安全释放资源的一种手段,只有采用这种手段才可以更清晰、更可靠。
当然使用智能指针std::auto_ptr也有一些要注意的地方:
第一、不能同时让两个std::auto_ptr指针指向同一个对象,如果两个std::auto_ptr指针赋值时,就会把所有权指向另一个指针。
在这个函数里,nVal指针会为空,而把内存指针转向pVal指针。这就是所谓的控制权转移的特性。
第二、std::auto_ptr智能指针不能使用在数组指针,因为它不能区分是一般指针,还是数组指针。
第三、std::auto_ptr智能指针不能容器对象。因为容器对象赋值或拷贝的动作,就会导致指针的丢失。
第四、std::auto_ptr智能指针只是简单智能指针,有很多种情况并不适合。因此,就需要引入更加复杂的智能指针,比如boost库里的scoped_ptr、scoped_array、shared_ptr、shared_array、intrusive_ptr、weak_ptr等指针。boost库里这些指针,都是针对每一方面特定的解决方案,并不是所有地方都可以统一使用,要熟悉这些智能指针的使用,需要花费一些时间来学习,并练习更多的例子,就可以在不同的情况下,选择更合适的方案,防止更多的错误出现。
//异常抛出的函数,适合使用智能指针。 //软件开发人员: 蔡军生 2013-02-03 void ThrowFun(void) { if (1) { throw "Test Throw!"; } } void TestCallThrow(void) { std::auto_ptr< int > nVal(new int); ThrowFun();//这里抛出异常,分配的内存自动删除。 *nVal = 1000; }
在这个例子里,当函数TestCallThrow调用一个有异常抛出函数ThrowFun时,如果没有使用智能指针,就比较麻烦了,那么就必须先捕捉这个异常输出,在异常里再添加一个删除内存的操作。如果调用函数比较多,层次比较多,就需要更多的捕捉异常了,这样导致代码也比较难理解,容易出错。
在异常处理里,智能指针作为一个安全释放资源的一种手段,只有采用这种手段才可以更清晰、更可靠。
当然使用智能指针std::auto_ptr也有一些要注意的地方:
第一、不能同时让两个std::auto_ptr指针指向同一个对象,如果两个std::auto_ptr指针赋值时,就会把所有权指向另一个指针。
void TestAssign(void) { std::auto_ptr< int > nVal(new int); std::auto_ptr< int > pVal = nVal; *pVal = 100; }
在这个函数里,nVal指针会为空,而把内存指针转向pVal指针。这就是所谓的控制权转移的特性。
第二、std::auto_ptr智能指针不能使用在数组指针,因为它不能区分是一般指针,还是数组指针。
第三、std::auto_ptr智能指针不能容器对象。因为容器对象赋值或拷贝的动作,就会导致指针的丢失。
第四、std::auto_ptr智能指针只是简单智能指针,有很多种情况并不适合。因此,就需要引入更加复杂的智能指针,比如boost库里的scoped_ptr、scoped_array、shared_ptr、shared_array、intrusive_ptr、weak_ptr等指针。boost库里这些指针,都是针对每一方面特定的解决方案,并不是所有地方都可以统一使用,要熟悉这些智能指针的使用,需要花费一些时间来学习,并练习更多的例子,就可以在不同的情况下,选择更合适的方案,防止更多的错误出现。
相关文章推荐
- boost库在工作(6)作用域智能指针scoped_ptr之五
- boost库在工作(3)作用域智能指针scoped_ptr之二
- boost库在工作(2)作用域智能指针scoped_ptr之一
- boost库在工作(3)作用域智能指针scoped_ptr之二
- boost库在工作(4)作用域智能指针scoped_ptr之三
- boost库在工作(5)作用域智能指针scoped_ptr之四
- boost库在工作(6)作用域智能指针scoped_ptr之五
- boost库在工作(4)作用域智能指针scoped_ptr之三
- boost库在工作(4)作用域智能指针scoped_ptr之三
- boost库在工作(5)作用域智能指针scoped_ptr之四
- boost库在工作(2)作用域智能指针scoped_ptr之一
- boost库在工作(2)作用域智能指针scoped_ptr之一
- boost库在工作(6)作用域智能指针scoped_ptr之五
- boost库在工作(3)作用域智能指针scoped_ptr之二
- boost库在工作(8)引用计数的智能指针shared_ptr之一
- boost库在工作(9)引用计数的智能指针shared_ptr之二
- 【Boost】boost库中智能指针——scoped_ptr
- Boost库中的智能指针scoped_ptr,scoped_array
- [置顶] 从零开始学C++之boost库(一):详解 boost 库智能指针(scoped_ptr<T> 、shared_ptr<T> 、weak_ptr<T> 源码分析)
- 从零开始学C++之boost库(一):详解 boost 库智能指针(scoped_ptr<T> 、shared_ptr<T> 、weak_ptr<T> 源码分析)