从库中退出()可以被抛出异常替换?

这个问题在这里已经有了答案:

  • 如何重写exit(),也许通过抛出异常3个答案

  • 我知道你可能不想读这个,但是在它的任何部分尝试调用exit()或类似的东西之后继续执行一个程序很可能是一个错误。

    如果程序的一部分叫做exit() ,那么在这一点上你不能保证程序的状态。 你不知道堆是否处于一致状态。 你不知道堆栈是否有用。 如果将exit()转换为throw ,那么每次发生这种情况时,最可能遇到的都是内存泄漏。 您不知道导致此错误的库是否可以安全地再次调用。

    如果你已经检查过图书馆的源代码,并且你确定不会造成损坏,那么最简洁的解决方案就是修改图书馆本身,以便它抛出而不是退出。

    如果不允许更改磁带库,另一个清洁和正确的解决方案是将磁带库的所有用途放入单独的过程中,您可以监控和重新启动。


    上面的代码可以工作,但是在gcc 4.6之前的x86上,构建C代码时需要添加-fexceptions或-funwind-tables,以便堆栈解除发生。 你可以在这里看到细节。


    除非你的C ++实现被破坏,否则当调用exit (GCC没有被破坏,至少我尝试过的所有版本)时,它会调用析构函数获取全局变量。 所以你只需要清理那些不会被全局变量破坏者清理的东西。

    对于堆中的全局内容,可以使用atexit注册一个清理函数,该函数将在调用exit调用 - 此清理函数可以delete需要清理的任何堆对象。

    对堆栈中的东西进行析构是非常棘手的。 最好的解决方案可能是确保不需要调用这样的析构函数 - 在退出之前必须清理的任何东西都应该由全局(可能使用静态成员的类)引用,它在析构函数中进行清理。

    链接地址: http://www.djcxy.com/p/26123.html

    上一篇: Can exit() from a library be replaced with throwing an exception?

    下一篇: How to calculate the space complexity of function?