如何实现,bad-alloc 中止而不是抛出异常

How to achieve, that bad-alloc aborts instead of throwing an exception

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

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

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

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

  1. 使用 operator new and operator new[] 的 "no-throw" 变体。检查返回的空指针,然后中止。

  2. Set a new handler that calls std::terminate.

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

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

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