为什么boost :: diagnostic_information崩溃以及如何修复它?

时间:2018-02-01 21:58:40

标签: c++ c++11 boost boost-exception

我尝试使用boost :: exception但遇到了麻烦。我写下面的代码:

struct BaseExceptionXXX : public virtual std::exception, public virtual boost::exception
{
public:
    BaseExceptionXXX()
    { };
    virtual ~BaseExceptionXXX() {};

    BaseExceptionXXX(char const* const message)
        : std::exception(message)
    { }

    BaseExceptionXXX(const std::exception& e)
        : std::exception(e)
    { }

    BaseExceptionXXX(const BaseException& e)
        : std::exception(e)
        , boost::exception(e)
    { }

    bool IsEmpty() const
    {
        const std::string what_err = std::exception::what();
        return (what_err.empty() && boost::get_error_info<UserErrorInfo>(*this) == nullptr);
    }

    const char* what() const throw() override
    {
        return boost::diagnostic_information(*this).c_str(); //<-- crash here
    }
};


int main()
{
    std::string exception_description;

    try
    {
        BOOST_THROW_EXCEPTION(BaseExceptionXXX("hello exception"));
    }
    catch (BaseExceptionXXX& ex)
    {
        exception_description = ex.what(); //<-- crash here
    }
}

但它在函数中崩溃了:boost :: diagnostic_information(* this)。它崩溃的原因是:堆栈溢出

为什么会发生以及如何以正确的方式使用boost :: exception?

Boost版本 - 1.66

MSVS2017版本 - 15.5.5

1 个答案:

答案 0 :(得分:1)

由于无限递归,导致堆栈溢出。在您what()的实施中,您写道:

const char* what() const throw() override
{
    return boost::diagnostic_information(*this).c_str(); //<-- crash here
}

但是,收集的diagnostic_information的关键部分是,显然是,来自异常的what()消息。因此,what()将以递归方式调用自身。