【问题标题】:how to abort a c++ program and exit with status 0?如何中止 C++ 程序并以状态 0 退出?
【发布时间】:2012-01-10 14:13:52
【问题描述】:

我想终止我的 c++ 程序并立即终止而不激活任何类型的析构函数,尤其是静态和全局变量,但我想以状态 0 退出 - abort() 对我不起作用。

有人有解决办法吗? 谢谢

【问题讨论】:

  • 如果我可以问,为什么 abort() 不适合你?
  • 为什么不想激活析构函数?
  • "`该函数生成SIGABRT信号,默认情况下会导致程序终止返回一个不成功的终止错误代码给宿主环境。"
  • 如果什么都没有清理,那你为什么要退出代码为 0?
  • This question 如果您还没有阅读它,可能值得您花时间阅读。

标签: c++ abort


【解决方案1】:

也许_exit(0); 就是您要找的东西?

这里是man page 来了解它。

【讨论】:

  • 那会激活析构函数不是吗?
  • 在 C++11 中,这被标准化为 std::_Exit(继承自 C99)或 std::quick_exit
【解决方案2】:

来自 C++11 n3290 - § 18.5:

[[noreturn]] void _Exit(int status) noexcept;

程序在不执行自动、线程或对象的析构函数的情况下终止 静态存储持续时间并且不调用传递给 atexit() 的函数

这实际上是在 C99 中定义的,但实际上它适用于大量 C++11 之前的实现。

用途:

#include <cstdlib>
#include <iostream>

struct test {
  ~test() {
    std::cout << "Goodbye world" << std::endl;
  }
};

int main() {
  test t;
  _Exit(0);
}

【讨论】:

  • 我认为这会更有帮助,如果您要澄清这将适用于哪些 C++ 版本,哪些版本不适用。
  • @Styne666:n3290 表示 C++11。但该功能是 C99 的一部分。甚至在此之前它可能会起作用。
【解决方案3】:

_Exit(0) 来自stdlib.h 怎么样。 (演示:http://ideone.com/ecCgC

【讨论】:

  • 这仍然会调用全局和静态对象的析构函数。
  • @bitmask:不,它没有。检查 N3290 §18.5/3。
  • @bitmask:不在 C++11 中它不会。在 C++03 中,它没有指定,但可能仍然不会。
  • @MikeSeymour, KennyTM:很抱歉,该评论应该针对exit(0) 提案。要么这是 SO 引擎中的错误,要么我点击了错误的链接。
猜你喜欢
  • 2022-07-05
  • 1970-01-01
  • 1970-01-01
  • 2010-10-09
  • 2019-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多