为什么 std::find_if 可能会出现 std::bad_alloc 异常?

23

如标题所述,我就是不明白为什么这个函数会抛出std::bad_alloc异常。如果我们看一下cppreference中所有三种可能的实现方式,它们都像人们想象的那样,并且似乎没有特殊需要动态内存分配。


2
在您发布的链接中已经说明了:如果算法无法分配内存,则会抛出std::bad_alloc异常 - Casey
15
我认为问题更多的是:为什么算法需要尝试首先进行内存分配?该问题与IT有关。 - Jeremy Friesner
2
也许,还有一些需要查找表或其他辅助数据的高效算法可以使用。Boyer-Moore字符串搜索算法:预处理...需要两个表。 - Scheff's Cat
2
默认情况下,没有使用 noexcept 说明的标准库函数允许抛出实现定义的异常(请参见 https://eel.is/c++draft/res.on.exception.handling#4),而 find_if 没有任何 "Throws:" 条款限制它 (https://eel.is/c++draft/alg.find)。 - user17732522
4
为什么这个算法能否抛出 std::bad_alloc 很重要呢?大多数标准库函数都有可能抛出异常,尤其是 std::bad_alloc。如果您希望优雅地处理 std::bad_alloc 异常,那么您需要假设任何非 noexcept 的代码都有可能会抛出异常,因此需要编写几乎所有的代码。 - user17732522
显示剩余4条评论
2个回答

21
cppreference中展示的3种可能的实现是针对不带执行策略的3种重载。确切地说,那些带有执行策略的重载被列为可能抛出std::bad_alloc异常的函数。
执行策略涉及并行化或矢量化操作的可能性,因此需要额外的内存来完成操作,而非并行化/矢量化版本中仅依赖于标量变量。
编辑:正如@user17732522在评论中所说:

默认情况下,没有noexcept规范的标准库函数可以抛出实现定义的异常(见 eel.is/c++draft/res.on.exception.handling#4),find_if也没有任何约束“Throws:”子句(eel.is/c++draft/alg.find)。

因此,实现可以为任何重载提供可能抛出异常的std::find函数。

13

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接