C++中抛出异常的生命周期

Dol*_*000 3 c++ exception-handling

请考虑以下简单的C++代码:

void foo() {
    throw(my_exception());
}

void check_exc(const my_exception &exc) {
    /* Do stuff with exc */
}

void bar() {
    try {
        foo();
    } catch(const my_exception &exc) {
        check_exc(exc);
    }
}
Run Code Online (Sandbox Code Playgroud)

bar的异常处理程序中,引用的异常如何exc仍然存在,看看它是如何在foo堆栈帧中分配的?在异常处理程序运行时,该帧是否应该被解除,并且在那里分配的任何值都已经被认为是死的?特别是因为我明确地调用了另一个需要堆栈空间的函数.

作为一名试图学习C++的C程序员,我在这里误解了什么?这些不同的值实际上存在于内存中,更准确地说是什么?

Mik*_*our 7

在throw-expression中创建的临时用于初始化异常对象本身,(引用标准)"以未指定的方式分配".该对象(至少)持续到处理异常为止,因此处理程序对它的引用在处理程序或从处理程序调用的任何函数中都是有效的.