如何使用消息正确创建自定义异常?

时间:2014-09-10 05:24:58

标签: c++ exception c++11

我是C ++的新手,我试图创建一个自定义异常,在其ctor中接收一条消息。

我现在拥有的是:

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是char,或更具体地说,c = line[x];其中xint并且linestd::string);

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

问题是我的Exception获得了一个完全不相关的字符串(这是抛出相同方法的一部分:throw std::exception("There is more than 1 player start in the level."))。

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

据我了解,C ++默认是按值复制的。所以我认为调用LevelLoadException的ctor会立即复制字符串。但似乎有一些指针正在进行,因为我构建的字符串看起来像一个C字符串(const char*)。

我查看了std::exception类,这需要const char* const&作为消息,然后做一些类似C的strcopy / malloc(MSVC / Visual Studio 2012 Update 4)。< / p>

我不是百分之百确定我真正需要的东西。我想我想要的是一个在调用者中构建的字符串,然后移动/复制到Exception(它现在拥有一个仅由异常拥有的字符串的副本),然后是当呼叫者超出范围时,呼叫者将被销毁。

有人可以给我a pointer我应该采取哪些不同的做法吗?

1 个答案:

答案 0 :(得分:12)

"Invalid Character in Level: " + c并不能按照您的想法行事。它表示&#34;一个char*指针,它从字符串文字的开头偏移N个字节&#34;,其中N是存储在{的{1}}字符的ASCII代码{1}}。机会很高,文字实际上比c字符短,在这种情况下,该程序包含缓冲区溢出并显示未定义的行为。

成功

N