【发布时间】:2017-07-20 16:11:12
【问题描述】:
我见过几个类似的 sn-ps 代码,看起来像这样:
struct MyExcept : std::exception {
explicit MyExcept(const char* m) noexcept : message{m} {}
const char* what() const noexcept override {
return message;
}
const char* message;
};
void foo() {
std::string error;
error += "Some";
error += " Error";
throw MyExcept{error.c_str()};
}
int main() {
try {
foo();
} catch (const MyExcept& e) {
// Is this okay?
std::cout << e.message << std::endl;
}
}
在注释Is this okay? 之后的行中,我们读取了使用std::string 在foo 函数中分配的c 样式字符串。由于字符串被堆栈展开破坏,这是未定义的行为吗?
如果它确实是未定义的行为,如果我们用这个替换 main 函数呢?
int main() {
foo();
}
由于没有catch,编译器不会强制展开堆栈,而是在控制台中输出what()的结果并中止程序。那么它仍然是未定义的行为吗?
【问题讨论】:
标签: c++ exception c++14 undefined-behavior stack-unwinding