这是我的异常代码:
class OptionNotFoundError: public std::exception {
public:
OptionNotFoundError(std::string option, int position) throw()
: option(option), position(position) {}
OptionNotFoundError(char option_, int position) throw()
: position(position) { option.push_back(option_); }
virtual ~OptionNotFoundError() throw() {}
virtual const char* what() const throw() {
std::string what_str = "Option '" + option + "' not found in position " + std::to_string(position);
std::cout << what_str.c_str() << std::endl;
return what_str.c_str();;
}
std::string option;
int position;
};
当抛出异常时,这是我在终端中获得的内容:
terminate called after throwing an instance of 'Args::OptionNotFoundError'
Option 'c' not found in position 1
what():
所以cout
工作正常,但......不是回报。如果我使用return "smth"
,它可以正常工作。
Weirder:如果我用
替换what_str定义std::string what_str = "test";
我得到了
terminate called after throwing an instance of 'Args::OptionNotFoundError'
test
what(): x�zL�
同样,cout<<
工作正常。但回归......不是那么多。这是一些编码错误吗?
答案 0 :(得分:4)
return what_str.c_str();;
c_str()
返回指向std::string
的内部内容的指针。
此指针仅在
之前保持有效 std::string
对象被破坏。
std::string
对象被修改。
当函数返回时,获取此std::string
指针的c_str()
对象将被销毁。
这会导致未定义的行为。
您的函数返回的const char *
无效。它指向被破坏对象的内部内容。
答案 1 :(得分:2)
对于第一种情况,请注意what_str
是what()
内的局部变量,当它离开函数作用域时它将被销毁,然后它返回的指针变为悬空状态,取消引用它会导致UB。
对于第二种情况,返回"smth"
工作正常,因为"smth"
是const char[5]
,这是string literal,
字符串文字具有静态存储持续时间,因此存在于程序生命周期的内存中。
对于第三种情况,
如果我用
替换what_str
定义std::string what_str = "test";
它不起作用,因为what_str
仍然是本地std::string
,问题与第一种情况相同。