当扩展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 *的正确方法而又没有这些问题,但仍保留了正确的内存管理?

最佳答案

您需要将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;
}

关于c++ - 从函数返回const char *的正确方法,例如,重写std::exception::what(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18346402/

10-12 22:16