在异常期间C ++堆栈展开期间,本地异常值存储在哪里

时间:2019-04-14 22:45:43

标签: c++ reference stack throw stack-unwinding

我熟悉C ++异常的思维模型,以及如何以编程方式控制它。例如,此答案中的所有内容:SO Question on topic

但是,令我感到困惑的是,如果异常对象是在抛出堆栈帧中实例化的值,并且当前帧和任意数量的先前帧是如何保存的,异常对象的保存方式(捕获可以拦截的内容)退绕,所有拥有的本地人都被破坏(如果使用RAII编写)。为了使事情更难以理解,建议的模式是按进行抛出,并按 const&进行捕捉...一个堆栈已消失的值?...引用a在很久以前销毁的框架上可能未命名的值?我显然缺少了一些东西。对退出的局部函数对象的引用是一个新手的经典错误,但是在这种情况下,还是建议这样做。我推测与用户代码混合的throw catch模式是一种错觉,其实现是完全不同的,但这让我仍然想知道,(隐式未分配堆的)异常对象存储在哪里,因此可以在运行时捕获它变量的位置,考虑到似乎将其值存储在其中的堆栈帧注定要立即展开?

编辑:受@RichardCritten的“实现细节响应”启发的一些切线问题:如果将异常对象实例化为l值而不抛出该怎么办?如果将这样的一个l值参数化并进行了论证,然后又被另一个函数抛出(保证它仍然知道throw上下文)怎么办? 如果该对象分配有new对象,并且该对象的引用用于抛出该怎么办?您是否被迫“仅按照建议使用异常,并相信异常将按照标准要求行事”?

0 个答案:

没有答案