【问题标题】:Exiting a program without coredump or Segmentation Faults在没有核心转储或分段错误的情况下退出程序
【发布时间】:2014-07-28 14:41:54
【问题描述】:

我想知道是否有一些方法可以在不引起segfaultcore dump 的情况下突然退出/终止程序。

我查看了 terminate()exit()return 0。它们似乎都不适用于我的项目。

if(this->board.isComplete())
 {
     Utils::logStream << " complete "<< endl;
     this->board.display();
     exit(0);
     //std::terminate();
     //abort();
     //raise(SIGKILL);
     return true;
}

【问题讨论】:

  • exit(0) 应该可以工作(对于大多数工作定义......这取决于您是否“需要”完成关闭操作) - 当您尝试时会发生什么?
  • @Tony D exit(0) 似乎符合我的问题要求。但程序从不关闭它打开的文件。
  • @Ben,您可能需要澄清一下。就目前而言,您的评论毫无意义。忘记释放内存本身并不会导致 segv。
  • @Ben 不,我没有使用任何东西,我相信。如果是,我怎么能删除所有的记忆?
  • @DavidO exit(0) 适用于不提供 segfault ,我一定做错了什么。

标签: c++ exit terminate quit


【解决方案1】:

exit()/abort() 和类似的函数通常不是终止 C++ 程序的正确方法。正如您所注意到的,它们不运行 C++ 析构函数,从而使您的文件流处于打开状态。如果您确实必须使用exit(),那么使用atexit() 注册一个清理函数是一个好主意,但是,我强烈建议您改用C++ 异常。出现异常时,会调用析构函数,如果在终止前需要进行一些顶级清理,您总是可以在main() 上捕获异常,进行清理,然后正常返回并返回错误代码。这也可以防止代码转储。

int main()
{
    try 
    {
        // Call methods that might fail and cannot recover.
        // Throw an exception if the error is fatal.
        do_stuff();
    }
    catch(...)
    {
        // Return some error code to indicate the 
        // program didn't terminated as it should have.
        return -1;
    }

    // And this would be a normal/successful return.
    return 0;
}

【讨论】:

  • 谢谢。我尝试了你的方法,它就像我想要的那样工作
  • 酷,确保“接受”我的回答,@flyaboveothers ;)
猜你喜欢
  • 2020-04-27
  • 2021-08-06
  • 2019-01-14
  • 1970-01-01
  • 2013-02-22
  • 2023-04-11
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
相关资源
最近更新 更多