当扩展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/