其它综合

boost库在工作(5)作用域智能指针scoped_ptr之四

我爱IT资讯库   2021/02/24

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

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




热门内容

Error:couldnotopen`C:\ProgramFiles\Java\jre6\lib\i386\jvm.cfg'

昨天刚过情人节!哈哈,好久没记录学习内容了,今天在房子闲着没事重新安装jdk,按道理很简单的; 第一步下载jdk; ...

第49周二

晚上总结下今天,主要是在完善用户需求文档,同时看了jquery相关的操作技巧,主要是想学习jquery源码,在知乎jqu ...

C++ #include 和 using std::string

今天,偶尔写了一个小小的程序,关于字符串问题程序。 比如,我想连续打印用户输入的字符串。 #include&l... ...

Struts Hibernate Spring 经典面试题

Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建Ses... ...

SAP Performance浅析

本文来源于:http://scnblogs.techweb.com.cn/tcsapbw/archives/106... ...

数据库MySQL与xls文件的互导

      最近的一个项目需要将xls表导入到MySQL数据库中和将MySQL数据表导出到... ...

Head-of-Line Blocking (线头阻塞)

Head of Line (HOL) Blocking 产生的原因: 概念:队列的首个packet由于它的目的... ...

Python set的高效利用

python set的应用   ... ...

CollectionFrameWork

collectionframework如下: collection ├list │├linkedlist │├array ...

JAVA访问修饰符构造函数的问题(转)

java访问修饰符 构造函数的问题 java访问修饰符-限定符总结(类比c#) java访问修饰符--------- ...

PAT甲1004CountingLeaves【dfs】

1004counting leaves(30 分) a family hierarchy is usually p ...

171.[LeetCode]Excel Sheet Column Number

题目: Related to question Excel Sheet Column Title ... ...

在.NET中获取一台电脑名,IP地址及当前用户名

在.NET中获取一台电脑名,IP地址及当前用户名是非常简单,以下是我常用的几种方法,如果大家还有其他好的方法,可以回复一... ...
sun directory server

sun directory server

Sun One Directory Server(LDAP)安装和调整指南   ... ...
黑客讲故事:攻下隔壁女生路由器后,我都做了些什么

黑客讲故事:攻下隔壁女生路由器后,我都做了些什么

路由器被蹭网后,我有被黑的风险吗? Evi1m0,来自知道创宇,邪红色信息安全组织创始人 其实这个问题可以... ...

oracle 10g for redhat5

解压文件 解压文件命令: unzip 10201_database_linux32.zip ... ...

什么是I2C协议?

I2C协议是单片机与其它芯片常用的通讯协议,由于只需要两根线,所以很好使用。 一. I2C协议技术性能:&nb... ...

[USACO15DEC]最大流MaxFlow

题目:洛谷p3128。 题目大意:一棵n个点的树,每次将两个节点最短路径所覆盖的所有节点的流量加1。问你最后流量最大的节 ...

kde4.1 alpha1

KDE Project Ships First Alpha of KDE 4.1 KDE Commun... ...

oracle 函数 和 优化

sql语句中,如果where条件里面含有not, !=, <> ,null ,则即使该字段建有索引,也... ...
09年中国互联网企业市值排名

09年中国互联网企业市值排名

这是一个最坏的时代,也是一个最好的时代。自07年底美国次贷危机以来,全球经济发生了巨大的变化。股票市场也随之跌荡起... ...

用于发送UDP消息的SQL Server 扩展存储过程

下载源文件 13.1 kb介绍我希望能够发布 sql server 表更新,因此修改了微软的示例扩展存储过程 xp_he ...

Cache与Fetch(二)

这两天一直百思不得其解的问题终于解决了,这个问题如下: 通过HQL:“select distinct forumGr... ...

[转]小规模低性能低流量网站设计原则

作者: Fenng 网址: http://www.dbanotes.net/arch/small_site... ...

divcss圆角

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transit... ...

Kindle Paperwhite 越狱/加字体/支持PDF、EPUB、DjVu、FB2、CHM和DOC文档

0. 升级 官网固件升级:http://www.amazon.com/gp/help/customer/displ... ...
购物网第二阶段总结笔记3:用户注册模块

购物网第二阶段总结笔记3:用户注册模块

事先工作: 【1】建立用户表:  分析静态页面的用户信息,可以得出用户表所需的字段,建立用户表S... ...

pythonbottleweb框架简介

bottle 是一个快速,简单,轻量级的 python wsgi web 框架。单一文件,只依赖 python 标准库 ...

Android Log介绍

android.util.Log常用的方法有以下5个:Log.v() ,Log.d() ,Log.i() ,Log.w(... ...

target action版简化命令设计模式原理分析

我们知道在Cocoa程序中, 如果你想处理一个窗口的事件或者应用程序的事件, 你可以使用Delegate的方法来实现响应... ...