从函数返回const char *的正确方法,例如,重写std :: exception :: what()

时间:2013-08-20 23:13:05

标签: c++

当扩展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()in它可能会有问题我的代码的一部分。

如果有正确的方法从函数返回const char *而没有这些问题保留适当的内存管理?

2 个答案:

答案 0 :(得分:7)

你需要在你的类中存储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;
}

答案 1 :(得分:5)

您正在返回指向临时的指针,当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()成员函数,因此您的类无需实现它。