不可避免地调用 abort() 可能会产生什么影响?

What are the possible effects of a unavoidable call of abort()?

cppreference abort中,我们有

Destructors of variables with automatic, thread local and static storage durations are not called. Functions passed to std::atexit() are also not called. Whether open resources such as files are closed is implementation defined.

我对“关闭”我的程序的 abort 术语的术语和矛盾感到困惑可能分别不是 called/closed。那么,是否有可能我的程序仍然是 运行,并且在调用 abort() 后它有一些内存泄漏或资源仍然打开?

Functions passed to std::atexit() are also not called. Whether open resources such as files are closed is implementation defined.

这意味着实现可以决定发生什么。在任何常见的消费者操作系统上,当您的进程退出时,与您的进程关联的大多数对象都会被销毁。这意味着您不会泄漏分配给 new 的内存,也不会打开文件。

可能有一些不常见的对象未被释放 - 例如,如果您有一个共享内存块,它可能会保留下来以防另一个进程试图访问它。或者,如果您创建了一个临时文件,打算稍后将其删除,现在该文件将保留在那里,因为您的程序无法删除它。

就像杀人一样。他们将没有机会支付任何未付账单、整理遗产、打扫公寓等。

是否会发生这种情况取决于他们的亲属或其他第三方。

所以,通常打开的文件之类的东西会被关闭并且不会泄漏内存,因为 OS 会处理这个(比如警察什么时候会清空公寓)。有一些平台不会发生这种情况,例如 16 位 windows 或嵌入式系统,但在现代 windows 或 Linux 系统下它会没问题。

然而,绝对不会发生的是析构函数是运行。这就像让被杀的人在他们的日记中写下最后一条记录并封印之类的——只有那个人自己知道该怎么做,而当你在没有警告的情况下杀死他们时,他们就做不到。因此,如果在析构函数中应该发生任何重要的事情,它可能会有问题,但通常不会很严重 - 它可能类似于程序在某处创建了一个临时文件并且通常会在退出时删除它,现在它不能并且文件保留。

不过,您的程序将被关闭,不再 运行ning。它只是没有机会清理东西,因此取决于 OS 做正确的事情并清理它使用的资源。

在 Unix 上,调用 abort() 有效地向您的进程传递一个 SIGABRT 信号。传递该信号时内核的默认行为是关闭您的进程,可能会留下一个核心文件,并关闭所有描述符。您的进程的控制线程已完全删除。请注意,这一切都发生在 c++(或任何其他语言)的任何概念之外。这就是为什么它被认为是实现定义的。

如果您希望更改默认行为,则需要安装信号处理程序来捕获 SIGABRT。