gpt4 book ai didi

c++ - 是否有等待内存可用的 nothrow new ?

转载 作者:太空狗 更新时间:2023-10-29 21:44:20 25 4
gpt4 key购买 nike

阅读前this question ,我从来没有认真对待过异常处理。现在我看到了必要性,但仍然觉得“编写异常安全代码非常困难”。

在该问题的已接受答案中查看此示例:

void doSomething(T & t)
{
if(std::numeric_limits<int>::max() > t.integer) // 1. nothrow/nofail
t.integer += 1 ; // 1'. nothrow/nofail
X * x = new X() ; // 2. basic : can throw with new and X constructor
t.list.push_back(x) ; // 3. strong : can throw
x->doSomethingThatCanThrow() ; // 4. basic : can throw
}

正如答案所说,我可以使用 std::unique_ptr 轻松提供基本保证。但是,当我捕获到 std::bad_alloc 时,我不知道它是发生在 push_back 还是 x->doSomethingThatCanThrow() 中,所以我不知道 t.list 是否仍然“好”或者它的最后一个元素没有完全准备好。那么唯一的选择就是丢弃 t,显示一条可怕的消息并中止,如果 t 对整个程序来说是必不可少的。

有强保证的代码没有问题,但是“它可能变得代价高昂”(这个例子涉及到大列表的拷贝),而且可读性不强。

一个可能的解决方案可能是让 new 等待内存可用,从而移除最恼人的异常 std::bad_alloc。然后 2. 和 3. 不会抛出(前提是 X 的构造和复制总是成功)。我可以将 4. 包装在一个 try block 中并在此处处理异常(并 pop_back 列表)。然后该函数将提供不抛出保证,列表将始终包含好东西。

用户不会关心 100% CPU 和 100% RAM 之间的区别。当他们看到一个程序挂起时,他们将关闭其他程序,以便 new 找到足够的内存并继续。

我的问题:这能实现吗?是否有等待内存可用的 nothrow new ?我能否在全局范围内应用它(例如通过 #define new ...),以便 C++ 标准化之前的库可以在临时 100% RAM 中存活?

最佳答案

这是一个有问题的设计,但您当然可以使用“新处理程序”来做到这一点。默认的新处理程序只是抛出 std::bad_alloc。如果 new-handler 返回,new 将循环,并尝试再次分配。它也被 nothrow new 运算符使用,但是 new-handler 抛出的 std::bad_alloc 被捕获,在这种情况下返回 NULL

您只需要 set您的自定义 void (*)() 处理程序函数的新处理程序。至少,您可能想让进程休眠一段时间——比如 1/10 秒。同样,程序可能无法继续运行 - 例如,Linux 具有可由管理员配置的“OOM killer ”。

关于c++ - 是否有等待内存可用的 nothrow new ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20344256/

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