【发布时间】:2014-09-19 13:40:37
【问题描述】:
考虑以下简单的 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);
}
}
在bar 的异常处理程序中,exc 引用的异常如何仍然存在,看看它是如何在foo 的堆栈帧中分配的?在异常处理程序开始运行时,该帧不应该已经展开,并且在那里分配的任何值都已经被认为是死的?尤其是因为我明确地调用了另一个需要该堆栈空间的函数。
作为一名试图学习 C++ 的 C 程序员,我在这里误解了什么?更准确地说,这些不同的值实际上存在于内存中的什么位置?
【问题讨论】:
-
例外被特殊处理以允许这样做。我想说你没有误解任何东西,只是你不知道这个特殊规则:)
-
例外情况是它们是例外。 :) 这意味着编译器和运行时环境会对它们进行特殊处理,以确保它们不会超出范围。
-
阅读 Scott Meyer 的More Effective C++ - Item 13: Catch exceptions by reference,他在其中讨论了这是如何工作的,以及为什么您应该更喜欢
catch (my_exception &exc) {}而不是其他形式。跨度> -
@AlexMDC:假设您正确复制了 Scott 的建议,那是假的。而不是
catch (my_exception &exc) {}做catch (my_exception const& exc ) {}。更强的保证,更多的约束,更少的出错。