Simon_CB_Zhao 2019-01-15 11:11 采纳率: 75%
浏览 483
已采纳

C++ const 引用捕获异常为什么是正确的?

C++ 使用const引用捕获异常 没有问题吗?如图所示,函数抛出临时对象应该是放在栈上的,捕获的时候使用的是const 引用,引用本质上就是指针,那么在使用引用的时候,对应的临时对象在栈上已经释放了呀?所以...

void MyFunc(int i)
{
    try
    {
        func(i);
    }
    catch(int i)
    {
        switch(i)
        {
            case -1:
                throw Exception(-1, "Invalid Parameter");
                break;
            case -2:
                throw Exception(-2, "Runtime Exception");
                break;
            case -3:
                throw Exception(-3, "Timeout Exception");
                break;
        }
    }
}

int main(int argc, char *argv[])
{
    try
    {
        MyFunc(11);
    }
    catch(const Exception& e)
    {
        cout << "Exception Info: " << endl;
        cout << "   ID: " << e.id() << endl;
        cout << "   Description: " << e.description() << endl;
    }
    catch(const Base& e)
    {
        cout << "catch(const Base& e)" << endl;
    }

    return 0;
}
  • 写回答

2条回答 默认 最新

  • ChenSu2008 2019-01-15 14:31
    关注

    throw 表达式初始化一个称为异常对象的特殊对象,由编译器管理并驻留在catch可访问的空间。
    而&标号,只不过说可以直接操作这个对象而不是从新copy它。
    详细可参考 C++ prime 第17章。

    补充一下
    throw的时候其实创建两个对象,一个本对象,一个根据本地对象拷贝构造的特殊对象
    你的那个引用只不过指向了那个特殊对象。不用引用的话,也会再拷贝构造一个对象的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作