3

扩展时std::exception,我想知道覆盖的正确方法what()

可以说我有一个异常类:

class MyException : public std::exception {
  public:
    MyException(const string& _type) : m_type(_type) {}

    virtual const char* what() const throw() {
      string s = "Error::" + _type;
      return s.c_str();
    }
}

我在上面的代码中使用了静态分析工具,它抱怨字符串会离开范围并破坏与字符串关联的内存,所以如果我在代码的某些部分s使用它可能会出现问题。what()

如果有适当的方法const char*从函数返回 a 而不会保留适当的内存管理?

4

2 回答 2

9

你需要将string实例存储在你的类中,否则当你的函数返回时,它的内存将被释放what(),给调用者留下一个悬空指针:

class MyException : public std::exception {
  public:
    MyException(const std::string& _type)
      : m_what("Error::" + _type)
    {
    }

    virtual const char* what() const throw() {
      return m_what.c_str();
    }

  private:
    std::string m_what;
}
于 2013-08-20T23:17:18.450 回答
6

您正在返回一个指向临时对象的指针,该临时对象将在what()调用退出时被销毁。

std::runtime_error从而不是派生您的异常类std::exception。然后将代码更改为:

class MyException : public std::runtime_error {
  public:
    MyException(const string& _type) 
    : std::runtime_error("Error::" + _type) 
    {}
};

std::runtime_error实现了what()成员函数,所以你的类不需要实现它。

于 2013-08-20T23:18:54.067 回答