繁体   English   中英

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

[英]Proper method of returning const char* from a function, e.g., overriding std::exception::what()

当扩展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;
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM