在cppreference abort中,我们有
不调用具有自动,线程本地和静态存储持续时间的变量的析构函数。传递给std :: atexit()的函数也不会被调用。是否关闭文件等开放资源是实现定义的。
我对“关闭”我的程序的 abort 术语的术语和矛盾感到困惑,并且从该函数的描述中说它可能没有调用析构函数和开放资源/分别关闭。那么,在调用abort()之后,我的程序是否仍然可以运行并且有一些内存泄漏或资源仍然打开?
答案 0 :(得分:3)
也不会调用传递给std :: atexit()的函数。文件等开放资源是否已关闭是实施定义。
这意味着实现可以决定发生了什么。在任何常见的消费者操作系统上,与进程关联的大多数对象在进程退出时都会被销毁。这意味着您不会泄漏用new
分配的内存,例如,打开文件。
可能有一些不常见的对象未被释放 - 例如,如果您有共享内存块,它可能会保留,以防其他进程尝试访问它。或者,如果您创建了一个临时文件,打算稍后将其删除,那么现在该文件将保留在那里,因为您的程序无法删除它。
答案 1 :(得分:1)
就像杀人一样。他们没有机会支付任何未结账单,组织他们的遗产,清理他们的公寓等。
是否发生任何此类事件取决于其亲属或其他第三方。
因此,通常打开文件之类的东西会被关闭,并且没有内存会被泄露,因为操作系统负责这一点(就像警察那样将会清空公寓)。有些平台不会发生这种情况,例如16位窗口或嵌入式系统,但在现代Windows或Linux系统下,它会没问题。
然而,绝对不会发生的是析构函数的运行。这就像让被杀人在他们的日记中写下最后一个条目并密封它或者其他东西 - 只有这个人自己知道怎么做,而且当你在没有警告的情况下杀死他们时他们不能。因此,如果在析构函数中发生任何重要的事情,那么它可能会有问题,但通常不会显着 - 它可能就像程序在某处创建了一个临时文件,并且通常会在退出时删除它,现在它不能和文件保留。
仍然,您的程序将关闭,不再运行。它只是没有机会清理东西,因此取决于操作系统做正确的事情并清理它所使用的资源。
答案 2 :(得分:1)
在Unix上,调用abort()可以有效地向进程发送SIGABRT信号。传递该信号时内核的默认行为是关闭进程,可能留下核心文件,并关闭任何描述符。您的流程的控制线程已完全删除。请注意,这一切都发生在c ++(或任何其他语言)的任何概念之外。这就是它被认为是实现定义的原因。
如果您希望更改默认行为,则需要安装信号处理程序以捕获SIGABRT。