当前位置: 首页 > 知识库问答 >
问题:

为什么std::find_if可能会因std::bad_alloc异常而失败?

于恺
2023-03-14

正如我在标题中所述,我只是不明白为什么这个函数会抛出<code>std::bad_alloc</code>。如果我们看一看cppreference,所有三种可能的实现都是如有人所假设的,并且看起来没有特别需要动态内存分配。

共有2个答案

宇文修文
2023-03-14

是因为模板中的执行策略。

“C标准允许并行算法分配内存,并在无法获取内存时抛出std::bad_alloc”

https://dev blogs . Microsoft . com/CPP blog/using-c17-parallel-algorithms-for-better-performance/

何哲
2023-03-14

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,它会抛出任何重载。

 类似资料:
  • 下面我写了一个C++函数,它通过一个整数向量进行循环。每通过一次,它就从所有的数字中减去最小的数字。它应该在每次传递时返回非零元素的数量(这存储在向量结果中并返回)。然而,每当我尝试运行时,我都会得到“std::bad_alloc”。当删除行“flag=true”时,错误就会消失。我将需要它工作,以便while循环中断。帮我修好这个。

  • 我有一个Visual Studio 2008 C++03应用程序,使用在Windows XP SP3中运行的Boost 1.47.0。 调用引发异常。 在“输出”窗口中,我看到一条调试堆消息:“heap[test.exe]:无效的分配大小-CDCDCDCE(超出7FFDEFFF)” callstack显示boost.filesystem正在创建一个新的区域设置和Microsoft标准库文件xloc

  • https://godbolt.org/z/P97MaK 我玩的概念和预期d::is_equality_comparable工作矢量,但它没有。 编译错误在 内部失败,而不是在受概念保护的函数边界处失败。 这是错误还是预期行为?

  • 在我的clang和libc版本中(靠近),这个传递: 当然,如果你真的试图复制构造一个唯一指针的向量,它无法编译: 我假设这种情况是因为

  • 我在让Spark Cassandra连接器在Scala中工作时遇到问题。 我正在使用这些版本: 斯卡拉 2.10.4 火花芯 1.0.2 卡桑德拉-节俭 2.1.0 (我安装的卡桑德拉是 v2.1.0) cassandra-clientutil 2.1.0 卡桑德拉驱动器核心 2.0.4 (推荐用于连接器? 火花-卡桑德拉-连接器 1.0.0 我可以连接并与卡桑德拉(没有火花)交谈,我可以与火花(