6

可能重复:
使 C++ 程序崩溃的最简单方法是什么?

我经常在我们的代码库中看到一个结构,程序以某种方式进入无效状态,代码会故意做一些错误的事情,只是为了强制崩溃。它通常是这样的:

if(<something is wrong>)
{
    int *ptr = NULL;
    *ptr = 0;
}

这当然会导致空引用异常并以不可恢复的方式使程序崩溃。我只是想知道这是否真的是最好的方法?首先,它读起来不好。如果没有评论,您可能不会意识到这里发生的崩溃是故意的。其次,几乎没有办法从中恢复。它不会抛出异常,因此无法由其他代码处理。它只是杀死程序而无法回溯。它也没有提供太多关于为什么它必须在这里崩溃的线索。它会在所有构建中崩溃,不像断言。(我们确实有一个非常强大的断言系统可用,但它并不总是在这种情况下使用。)

这是我们到处都在使用的风格,我无法试图说服任何人。我只是好奇这在行业中有多普遍。

4

3 回答 3

4

您不能以故意的方式“崩溃”程序,因为根据其定义,崩溃是程序出错并且无法确定性地运行时。

终止执行的标准方法是通过std::terminate;实现这一点的常用方法是调用std::abort,它会针对进程发出不可阻塞的信号(std::terminate自动导致),并且还会导致许多操作系统产生核心转储。

于 2012-11-21T21:26:10.153 回答
2

您应该抛出一个异常,这基本上是故意以受控方式导致崩溃。这是一个在这个问题的帮助下的例子。

throw string("something_went_wrong");

更好的是错误被捕获或修复。断言也是一个不错的选择。

于 2012-11-21T21:24:02.313 回答
1

我想这是在您不调试的情况下触发核心转储的方法。然后核心转储会为您提供足够的信息来分析问题。在“程序员错误”(或错误)的情况下,这比抛出异常要好,因为堆栈展开不允许您构建合理的核心转储。可以通过调用 std::terminate 以更优雅的方式实现类似的效果,该 std::terminate 先前已注册(使用 std::set_terminate)生成核心转储或类似内容的函数。有关更详细的说明,请参阅本文

于 2012-11-21T22:15:54.157 回答