C ++奇怪的字符串/ char *异常行为

时间:2016-09-03 15:24:08

标签: c++ arrays string exception stdstring

这是我的异常代码:

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<<工作正常。但回归......不是那么多。这是一些编码错误吗?

2 个答案:

答案 0 :(得分:4)

    return what_str.c_str();;

c_str()返回指向std::string的内部内容的指针。

此指针仅在

之前保持有效
  1. std::string对象被破坏。

  2. std::string对象被修改。

  3. 当函数返回时,获取此std::string指针的c_str()对象将被销毁。

    这会导致未定义的行为。

    您的函数返回的const char *无效。它指向被破坏对象的内部内容。

答案 1 :(得分:2)

对于第一种情况,请注意what_strwhat()内的局部变量,当它离开函数作用域时它将被销毁,然后它返回的指针变为悬空状态,取消引用它会导致UB。

对于第二种情况,返回"smth"工作正常,因为"smth"const char[5],这是string literal

  

字符串文字具有静态存储持续时间,因此存在于程序生命周期的内存中。

对于第三种情况,

  

如果我用

替换what_str定义
std::string what_str = "test";

它不起作用,因为what_str仍然是本地std::string,问题与第一种情况相同。