我是 C++ 的新手,我正在尝试创建一个在其构造函数中接收消息的自定义异常。
我现在拥有的是:
class LevelLoadException : public std::exception
{
public:
LevelLoadException(std::string msg) : m_message(msg) { }
const char * what () const throw ()
{
return m_message.c_str();
}
private:
std::string m_message;
};
在我的调用代码中,我将它作为 switch 语句的一部分(c
是一个字符,或者更具体地说,c = line[x];
其中 x
是一个 int
而 line
是一个 std::string
);
default:
throw LevelLoadException("Invalid Character in Level: " + c);
问题是我的异常得到一个完全不相关的字符串(这是抛出相同方法的一部分:throw std::exception("There is more than 1 player start in the level.")
).
我已经排除了一个逻辑错误——我的程序到达了抛出带有正确字符串的正确异常的那一行。所以我很确定这是一个生命周期/内存管理问题。
据我了解,C++ 默认是按值复制。所以我认为调用 LevelLoadException
的构造函数会立即复制字符串。但似乎有一些指针在发生,因为我正在构建的字符串看起来像 C 字符串 (const char*
)。
我查看了 std::exception
类,它采用 const char* const&
作为消息,然后在引擎盖(MSVC/Visual Studio 2012 Update 4)。
我不能百分百确定我真正需要什么。我想我想要的是一个在调用者中构建的字符串,然后移动/复制到异常中(它现在拥有仅由异常拥有的字符串的拷贝)然后调用者中的那个在它退出时被销毁范围。
谁能给我a pointer我应该做些什么来正确地做到这一点?
最佳答案
"Invalid Character in Level: "+ c
并没有按照您的想法去做。它的意思是“一个char*
指针,从字符串文字的开头偏移N
字节”,其中N
是ASCII码存储在 c
中的字符。文字实际上比 N
个字符短的可能性很高,在这种情况下,该程序包含缓冲区溢出并表现出未定义的行为。
成功
throw LevelLoadException(std::string("Invalid Character in Level: ") + c);
关于c++ - 如何使用消息正确创建自定义异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25757875/