C++ 如何正确创建带有消息的自定义异常? 中传递一条消息。

C++ 如何正确创建带有消息的自定义异常? 中传递一条消息。,c++,exception,c++11,C++,Exception,C++11,我现在得到的是: 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;

我现在得到的是:

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

问题是我的异常得到了一个完全不相关的字符串(这是抛出的同一个方法的一部分:
throw std::Exception(“级别中有多个玩家开始”)

我排除了一个逻辑错误-我的程序到达了抛出正确字符串的正确异常的行。所以我很确定这是一个终生/内存管理问题

我的理解是,C++默认是按值复制的。因此我认为调用

LevelLoadException
的ctor会立即复制字符串。但是似乎有一些指针的东西在发生,因为我正在构建的字符串看起来像是一个C字符串(
constchar*

我查看了
std::exception
类,它将
const char*const&
作为消息,然后在引擎盖下执行一些类似C的strcopy/malloc(MSVC/Visual Studio 2012更新4)

我不是百分之百确定我到底需要什么。我想我想要的是一个内置在调用方中的字符串,然后移动/复制到异常中(它现在拥有一个只属于异常的字符串副本),然后调用方中的字符串在超出范围时被销毁

有人能告诉我,为了正确地执行此操作,我应该采取哪些不同的措施吗?

“级别中的无效字符:“+c
不会执行您认为它会执行的操作。”。它表示“从字符串文字的开头偏移
N
字节的
char*
指针”,其中
N
是存储在
c
中的字符的ASCII码。很有可能,该文本实际上比
N
个字符短,在这种情况下,该程序包含缓冲区溢出并显示未定义的行为

成功

throw LevelLoadException(std::string("Invalid Character in Level: ") + c);

啊,谢谢。所以
“string”
返回一个
字符*
(对于C向后兼容),然后我在做指针数学(字符C变成数值99)?将<代码>“字符串”<代码>转换成C++字符串使用<代码>操作符+<代码> >代码> STD::String < /Cal> > @ PrutoRoiang:啊,对了。我会更正的,虽然它不会从根本上改变答案。@MichaelStum:你明白了(模
99
实际上是变量
c
中存储的任何字符的ASCII码;这是我的错误,很抱歉混淆).所以我得到了一些其他的有效字符串,而不是垃圾或访问冲突:)(好吧,可能是运气不好,因为访问冲突会更清楚)。谢谢,现在可以用了@MichaelStum:编译器通常将所有常量静态数据合并到程序生成的二进制文件的同一块中,并且通常更喜欢将所有字符串合并在一起,这样当您对字符串地址执行奇怪的操作时,您可以很容易地看到您描述的行为。您是否捕获到std异常?@Christophe No,我有
catch(LevelLoadException&e)在<>代码> STD::RunTimeOrthyEngult[/Cord]中,而不是<代码> STD::异常< /代码>。然后,您的类可以被还原为A。如果您决定不去“<代码> STD::RunTimeEngultEngult路由,您应该考虑按需格式化,作为创建那些<代码> STD::String < /Cords>时的分配错误。可能会引起麻烦。
throw LevelLoadException(std::string("Invalid Character in Level: ") + c);