C++不允许在函数的try中使用static局部变量的原因

在《INSIDE C++ MODEL》书中247页提到了如下一段话:

“shiyon给被静态初始化的objects,有一些缺点。例如,如果exceptiony handling被支持,那些objects将不能够被放置于Atry区段之内...."

想了一段时间才想明白这个问题,下面用一段代码来说明一下:

A.cpp


class A

{
}


int main()

{   

    try

    {

        static A obj;

        int i = 0;

        int c = 10 /i;  //throw exception

    }

   catch(...)

    {
    }

}

对于main函数中的A obj,应该都知道,编译器会针对obj做一个唯一性初始化

即:

A* pObj = 0;


int main()

{

    try

    {

        static A obj;

        (pObj == 0) ? 0: obj.::A(), pObj = &obj;

        int i = 0;

        int c = 10 /i;  //throw exception

    }

   catch(...)

    {

      (pObj == 0) ? 0 : obj::~A(), pObj =0;

    }   

    (pObj == 0) ? 0 : obj::~A(), pObj =0;

}

对于try-catch,有一个这样的特性,对于try中出现的局部变量,会在catch中生成其析构函数的调用,这个就会和main()末尾的析构重叠了。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值