C/C++编程:局部栈对象的构造和析构

1059 篇文章 285 订阅

一般而言,构造函数和析构函数的安全都如你预期:

{
	Point point;
	// point.Point::Point();  //一般安插在这里

	// point::Point::~Point(); //一般安插在这里
}

如果一个作用域({}括起来的区域)或者函数有一个以上的离开点:析构函数必须被放在每一个离开点(当前object还存活),比如:

{
	Point point;
	// constructor安插在这里
	switch((int)(point.x())){
		case -1:
			// destructor安插在这里
			return;
		case 0:
			// destructor安插在这里
			return;
		case 1:
			// destructor安插在这里
		default:
			// destructor安插在这里
			return;
	}
	// destructor安插在这里
}

上面,point的destructor必须在switch指令四个出口的return操作前被生成出来。另外也有可能在这个区段的结束符号(右大括号)之前被生成出来---- 即使程序分析的结果发现绝不会进行到那里。

同样,goto指令也可能需要很多个destructor调用操作,比如:

{
	if(cache)
		return 1;

	Point xx;
	// constructor安插在这里
	
	while(cvs.iter(xx))
		if(xx == value)
			goto found

	
	
	// destructor安插在这里
	return 0;
found:
   // destructor安插在这里
	return 1;
}

析构函数的调用操作必须放在最后两个return指令之前,但是却不必被放在第一个return之前,因为那时object还没有生成。

一般来说我们会把object尽可能的放在使用它的那个程序区段附近,这样做可以节省很多不必要的对象产生操作和销毁操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值