【发布时间】:2010-02-16 16:57:37
【问题描述】:
通过非常量引用在try-block中抛出一个构建在堆栈上的对象,捕获并修改它,然后通过引用另一个catch块抛出它有什么问题吗?
以下是我所指内容的简短示例。
struct EC {
EC(string msg) { what = msg; }
string where;
string what;
void app(string& t) { where += t; }
string get() { return what; }
};
try {
try {
try {
EC error("Test");
throw error;
}
catch (EC& e) {
e.app("1");
throw e;
}
}
catch (EC& e) {
e.app("2");
throw e;
}
}
catch (EC& e) {
e.app("3");
cout << e.where << endl;
cout << e.get() << endl;
}
这是否可能导致 e.what 包含垃圾,但 e.where 保持不变?例如:
e.哪里是“123”
e.get() 返回大量垃圾数据,直到碰巧碰到一个空字节。
【问题讨论】:
-
无法复制。也不会使用 app() 中的非常量引用进行编译。在任何情况下,您都不会抛出引用,而是抛出副本。
-
这不是用来编译的。该代码只是说明了我所指的内容。我问这样的事情是否会导致 e.get() 包含垃圾数据,而不是它是否可以编译和工作。
-
鉴于这不是真正的代码,如果需要复制构造函数,e.get() 返回垃圾的可能性不大。
标签: c++ exception undefined-behavior