为什么 boost::diagnostic_information 崩溃以及如何修复它?
Why boost::diagnostic_information crashed and how to fix it?
我尝试使用 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)。它崩溃的原因是:Stack overflow
为什么会发生这种情况以及如何以正确的方式使用 boost::exception?
增强版 - 1.66
MSVS2017 版本 - 15.5.5
由于无限递归,您正在导致堆栈溢出。在 what()
的实现中,你写:
const char* what() const throw() override
{
return boost::diagnostic_information(*this).c_str(); //<-- crash here
}
但是,diagnostic_information
收集的关键部分是 显然 来自异常的 what()
消息。因此,what()
将递归调用自身。
我尝试使用 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)。它崩溃的原因是:Stack overflow
为什么会发生这种情况以及如何以正确的方式使用 boost::exception?
增强版 - 1.66
MSVS2017 版本 - 15.5.5
由于无限递归,您正在导致堆栈溢出。在 what()
的实现中,你写:
const char* what() const throw() override
{
return boost::diagnostic_information(*this).c_str(); //<-- crash here
}
但是,diagnostic_information
收集的关键部分是 显然 来自异常的 what()
消息。因此,what()
将递归调用自身。