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

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

第二种情况,主要就是使用在调用异常抛出的函数的地方。如下面的例子:

//异常抛出的函数,适合使用智能指针。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库里这些指针,都是针对每一方面特定的解决方案,并不是所有地方都可以统一使用,要熟悉这些智能指针的使用,需要花费一些时间来学习,并练习更多的例子,就可以在不同的情况下,选择更合适的方案,防止更多的错误出现。

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

你可能感兴趣的文章
TinyOS实例介绍
查看>>
公式输入较好的参考
查看>>
深入浅出通信原理连载75-95(Python代码版)
查看>>
深入浅出通信原理连载41-70(Python代码版)
查看>>
Socket Programming
查看>>
数据分析
查看>>
h5原生js实现轮播图
查看>>
一 python入门
查看>>
redis简单使用
查看>>
iOS 真机调试不能连接网络的排错过程
查看>>
ubuntu命令
查看>>
做事太毛躁了 耽误了好几天
查看>>
Apple(苹果)发布会历年邀请函设计回顾
查看>>
lua堆栈操作常用函数学习二
查看>>
亚马逊中国副总裁:电商流血低价不可能长久
查看>>
[转]Linux联网问题
查看>>
Linq高级查询与分页查询
查看>>
设置Mysql登陆默认编码
查看>>
启动tomcat报错 java.lang.Exception: Socket bind failed
查看>>
SploitFun Linux x86 Exploit 开发系列教程
查看>>