如何实现,错误分配中止而不是抛出异常



在我们的应用程序中,我们将任何崩溃记录到包含堆栈跟踪的日志文件中。我们可以使用这些报告来确定崩溃原因。

问题是,我们倾向于在几个地方(实际上很多(捕获 std::exception,这使得报告在抛出bad_alloc时实际上毫无用处,因为堆栈跟踪丢失了。

如何改变行为,以便程序中止而不是抛出bad_alloc?当我们在 3 种不同的操作系统中编写时,因此使用了 3 种不同的 std 实现,因此我们希望避免更改 std 本身。

除了重新思考或重新设计以捕获更多定制的异常(我真的推荐(,您还有两个解决方案:

  1. 使用operator newoperator new[]的"无投掷"变体。检查返回的空指针,然后中止。

  2. 设置调用std::terminatenew处理程序。

我检查了异常层次结构(http://en.cppreference.com/w/cpp/error/exception(,似乎我们永远不需要捕获std::runtime_exception之外的任何内容,我们所有的内部异常类型都派生自std::runtime_exception。

所以我只是改变了我们程序中最广泛的捕获是 std::runtime_error 所以 std::bad_alloc 成为例外,我们可以妥善管理。

编辑:这只能从C++11开始使用

最新更新