[英]C++ exception string displayed as garbage on Mac OS with Xcode and CLion
我正在学习 C++。 我在我的 MBP、macOS 10.14.6、Xcode 11.0 上尝试了以下代码。
include <iostream>
using std::cout;
using std::endl;
using std::cerr;
void errthrow();
int main(int argc, const char * argv[]) {
try {
errthrow();
} catch (const char* pEx) {
cerr << pEx << endl;
}
}
void errthrow()
{
char message[10] {"Exception"};
throw message;
}
不是在终端中获取字符串“Exception”,而是输出文本“0\365\277\357\376”。
使用 CLion 编译,output 是这样的:`'���
该代码在 Windows 10,VS 2019 上运行良好。
您的代码具有未定义的行为。 这是一个非常微妙的问题,实际上只适用于 arrays。 当你这样做
char message[10] {"Exception"};
message
是 function 的本地消息。 当你抛出它时,不是复制数组,而是数组衰减为一个指针,而被复制的是指针。 因此,您会留下一个指向message
的指针,但在您退出 function 后message
不再存在。
如果你需要抛出一个 c 字符串,那么正确的方法是
throw "message to throw";
这是有效的,因为"message to throw"
是隐含的static
并且因此它将在程序的生命周期中存在。 当您捕获指针时,该指针仍然指向有效的 object,这与从数组中返回它时不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.