如果您习惯于在抛出 std::bad_alloc 时传递消息,则一种合适的技术是定义一个派生自 std::bad_alloc 的内部类,并覆盖“what”以提供适当的消息。
您可以将类公开并直接调用赋值构造函数,或者制作一个辅助函数,例如 throw_bad_alloc,它接受参数(和附加标量信息)并将它们存储在内部类中。
在调用“what”之前,该消息不会被格式化。这样,堆栈展开可能已经释放了一些内存,因此可以在捕获站点使用实际原因(内存耗尽、错误请求大小、堆损坏等)格式化消息。如果格式化失败,只需分配并返回静态消息。
修剪示例:
(提示:复制构造函数可以将 _Message 分配给 nullptr,而不是复制消息,因为消息是按需格式化的。移动构造函数当然可以没收它:-)。
class internal_bad_alloc: public std::bad_alloc
{
public:
// Default, copy and move constructors....
// Assignment constructor...
explicit internal_bad_alloc(int errno, size_t size, etc...) noexcept:
std::bad_alloc()
{
// Assign data members...
}
virtual ~internal_bad_alloc(void) noexcept
{
// Free _Message data member (if allocated).
}
// Override to format and return the reason:
virtual const char* what(void) const noexcept
{
if (_Message == nullptr)
{
// Format and assign _Message. Assign the default if the
// format fails...
}
return _Message;
}
private:
// Additional scalar data (error code, size, etc.) pass into the
// constructor and used when the message is formatted by 'what'...
mutable char* _Message;
static char _Default[];
}
};
//
// Throw helper(s)...
//
extern void throw_bad_alloc(int errno, size_t size, etc...)
{
throw internal_bad_alloc(errno, size, etc...);
}