当扩展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 *而没有这些问题保留适当的内存管理?
答案 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()
成员函数,因此您的类无需实现它。