我浏览了不同的网站,除了那些似乎不起作用的网站之外,找不到这个问题的任何答案。正如标题所示,我正在尝试找到一种方法来捕获我正在处理的库是否崩溃。我有一个 Root 类,它保存我的库中的许多管理器样式类的实例,并在其析构函数中释放这些实例。当然,管理器负责相当多的数据,因此如果没有正确处理它们,就有可能出现相当不可接受的甚至危险的内存泄漏程度。
我知道,当程序崩溃时,操作系统将释放该程序的堆栈空间,但这不包括调用已分配对象的析构函数。它还不包括删除执行期间分配的任何堆,这就是我处理库中大量内存的方式,这又回到了广泛的内存泄漏问题。
我在其他网站上遇到的很多答案只是说要注册一个函数atexit()
,但是如果应用程序崩溃,该功能将不起作用。而且,如上所述,由于崩溃不会调用析构函数,因此无法创建一个在销毁时关闭所有内容的全局单例,这是我处理此问题的最初想法。我的另一个想法是希望库的最终用户能够采取适当的预防措施来避免崩溃(通过广泛使用异常抛出),但我觉得这违背了良好编码库的想法,坦率地说,我认为它要求最终用户处理这个问题。
所以我想我的 TL;DR 问题是这样的:有没有办法通过标准 C++ 函数或某种管理器类来捕获库崩溃并适当处理它?
编辑:另外,我真的更喜欢一种跨平台的方式来处理这个问题。我的代码库大量使用 C++11 的功能,因此我以编程方式将可用编译器限制为最新版本的 GCC 和 Clang。
不仅如此,我还有几个类,例如 Logger,它们将关闭文件系统的流并打印出一些有关退出状态的消息。我还有一个内存跟踪器,可以报告文件中任何可能的内存泄漏,但仅限于其析构函数。
“有没有办法通过标准 C++ 函数或某种管理器类来捕获库崩溃并进行适当处理?”
对于你的问题,我能想到的最简洁的答案是:
坚持类别和类别C++ 标准错误处理 http://en.cppreference.com/w/cpp/error.
正如你所要求的atexit()
,该行为在标准参考 http://en.cppreference.com/w/cpp/utility/program/atexit以及。
Note还有进一步的处理程序机制,例如std::terminate_handler http://en.cppreference.com/w/cpp/error/terminate_handler,允许您以便携且符合标准的方式处理一些异常中止情况。
最后但并非最不重要的一点是,可能需要安装某些(特定于操作系统)信号处理程序 http://en.cppreference.com/w/cpp/utility/program/signal,以捕获错误,例如所谓的分段故障 (SIGSEV) http://en.cppreference.com/w/cpp/utility/program/SIG_types由于堆栈溢出或类似的事情而引发。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)