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

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

标准模板库里的智能指针std::auto_ptr,一般情况下,只适合在函数中使用,当离开这个函数时,就可以自动删除分配的资源。典型的情况有两种,一种是当一个函数代码比较多,判断条件很多,这样出口很多。另一种就是带有异常机制的代码,因为异常没有抛出来之前,没有办法确定那行代码会突然间就退出来,这种情况下对资源管理,会给软件开发人员带来很大的压力,即使很有经验的开发人员,也有点防不防的,会花大量的时间去解决这个问题,因而导致项目一推再推。下面通过代码来看看这两种情况是什么样子,以后只要碰到这两种情况,就可以毫不犹豫采用智能指针的方案来解决了。

第一种情况:

//多出口的函数,最适合使用智能指针。void MoreIf(void){	std::auto_ptr< int > nVal(new int);	//这里很多逻辑判断。	if (1)	{	} 	else	{		if (7)		{			//这里退出函数。			return;		}			}	if (2)	{	} 	else	{	}	if (3)	{	}	else	{		//这里退出函数。		return;	}	for (int i = 0; i < 1000; ++i)	{		if (4)		{			//这里退出函数。			return;		}	}}

像这个例子里,如果没有使用智能指针,需要在所有出口的地方,都需要添加删除分配资源的操作。特别当软件已经开发完成之后,给客户试用了,而客户又需要添加一种特别的判断,再来维护这些代码时,忘记添加删除资源,导致软件发送到客户那里又出错了,再次挨客户批,是吃力不讨好的事情。面对这种情况,无论是有经验的开发人员,还是刚入门的开发人员,都应立即使用智能指针吧!也许有人会问,为什么一定要采用分配资源的方式来分配对象,而不直接构造栈对象来解决呢?这个问题就得了解栈与堆内存的区别了,简单来说,栈内存分配比较小,一般为
1M
2M
大小。如果过多地使用栈,就会导致栈溢出,程序就会挂掉了。比如有递归调用的函数,经常就会遇到这样的问题。又比如分配的对象比较大,超过
2M
,再使用栈对象,也导致栈溢出。也许有人说,可以修改编译选项来实现更大的栈。嗯,这是一个方法,但不是万试万灵的,比如当你开发一个
LIB
库给别人使用时,就不可能强制别人开更大的栈了。当你维护一个老的代码,只想改一个动态连接库,也没有办法修改别人的代码了。因此,最好的情况就是使用分配堆对象的方案,就是最好的方案。

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

你可能感兴趣的文章
HTTP协议详解
查看>>
java多线程中的join方法详解
查看>>
ECLIPSE远程调试出现如下问题 ECLIPSE中调试代码提示找不到源
查看>>
java abstract修饰符
查看>>
数组分为两部分,使得其和相差最小
查看>>
有趣的排序——百度2017春招
查看>>
二叉树的最近公共祖先LCA
查看>>
数组中累加和为定值K的最长子数组长度
查看>>
素数对--腾讯2017校招编程
查看>>
JAVA集合--ArrayList实现原理
查看>>
synchronized与Lock
查看>>
数据库索引
查看>>
实现包含min,max,push,pop函数的栈
查看>>
实验2-6 字符型数据的输入输出
查看>>
实验3-5 编程初步
查看>>
实验4-1 逻辑量的编码和关系操作符
查看>>
实验5-2 for循环结构
查看>>
实验5-3 break语句和continue语句
查看>>
实验5-4 循环的嵌套
查看>>
实验5-5 循环的合并
查看>>