gpt4 book ai didi

c++ - 编写 "anti-lack of memory"异常安全代码

转载 作者:搜寻专家 更新时间:2023-10-31 02:02:08 27 4
gpt4 key购买 nike

我正在编写一个类来保存图的连接组件的状态,支持动态连接,并且每次删除或添加新边时,我都必须重新计算相邻组件以连接或拆分它们。

这些方法唯一可以抛出的异常是 std::bad_alloc .我的任何依赖项都不会抛出其他异常。因此,唯一可能的异常(exception)是由于 std::unordered_set<...>::insert 之类的方法导致内存不足。或 std::deque<...>::push_back .

这使我的算法设计变得非常复杂,因为我必须处理本地数据以保存差异,然后根据这些缓存的修改将所有修改移动到范围明确的 try-catch 中。 block 。

可读性大大降低,思考和编写异常安全代码的时间增加了很多。此外,内存过量使用使得处理此异常变得毫无意义。

遇到这种情况你会怎么做?确保异常安全的代码真的很重要吗,如果内存确实不足,您的代码可能无论如何都会失败,但可能稍后,整个程序也会失败?

因此,简而言之,是否值得处理内存不足异常,正如一条评论所指出的,考虑到同样的异常抛出机制也可能耗尽内存?

最佳答案

正如您所建议的,尝试在一个进程中优雅地处理内存不足的情况介于极其困难和不可能之间,具体取决于您正在运行的操作系统的内存行为。在许多操作系统(例如使用默认设置配置的 Linux)上,内存不足的情况可能会导致您的进程在没有任何警告或求助的情况下被简单地杀死,无论您的代码如何小心地尝试处理 bad_alloc 异常。

我的建议是让您的应用程序启动一个子进程(即它可以将自己作为子进程启动,并带有一个特殊的参数让子进程知道它是子进程而不是父进程)。然后父进程只是等待子进程退出,如果退出,它会重新启动子进程。

这样做的好处是不仅可以从内存不足的情况中恢复,还可以帮助您从可能导致子进程崩溃或过早退出的任何其他问题中恢复。

关于c++ - 编写 "anti-lack of memory"异常安全代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57856496/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com