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

任何 C 98 标准容器操作都可以抛出 std::bad_alloc吗?

楚俊逸
2023-03-14

我试图找出以下代码中是否需要try-catch:

std::vector<int> values;
// ignore that this can throw std::bad_alloc
values.push_back(1);
try {
    for (std::vector<int>::iterator iter = values.begin();
         iter != values.end(); ++iter) {
         ++(*iter);
    }
} catch (const std::bad_alloc&) { 
    // Is this needed?
}

浏览C 1998标准,我能找到的唯一线索是第23.1节“集装箱要求”第8点,其中包含以下句子:

此参数的副本用于在每个容器对象的生存期内由这些构造函数和所有成员函数执行的任何内存分配。

我对此的解释是,容器中的任何成员函数都可以调用分配器,因此任何成员函数都可以抛出std::bad_alloc。是我过于偏执还是真的是这样?

共有3个答案

陆文博
2023-03-14

我在标准中没有找到更具体的东西,所以在没有证据的情况下,我们不得不得出结论,从技术上讲,任何容器方法都可以抛出bad_alloc

就容器本身而言,我不会担心<code>begin抛出,但还有另一个问题:迭代器实现。如果迭代器是类类型的,那么理论上,此类实例的构造(或赋值)很可能抛出。因此,虽然我认为任何随机选择的标准库实现都不可能抛出,但您不能真正排除它。

哈雅珺
2023-03-14

理论上是的,任何标准库容器成员函数都可以抛出<code>bad_alloc。

大多数标准容器本身不抛出任何异常,除了(< code>std::vector::at()),但是它们可以抛出内存分配失败的异常或用户定义操作的异常。

我假设你的恐惧是push_back()抛出你的示例案例,如果不是,那么是的,你是偏执狂。eventhough,这是一个实现细节 在实践中,如果你只是得到迭代器(begin(), end()),几乎没有任何实现会尝试分配。

许俊晤
2023-03-14

如果你继续往下读,你会发现23.1/10,它给出了容器关于何时抛出异常的要求,特别是:

  • 没有<code>擦除()函数,<code>pop_back()或<code>po_front()函数引发异常
  • 返回迭代器的复制构造函数或赋值运算符都不会引发异常

如果你真的是偏执狂,那么你应该考虑<code>begin()</code>和<code>end()</code>的可能性,甚至迭代器增量,抛出;但在标准容器的任何合理实现中,他们不需要做任何复杂的事情。

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

  • 我正在经历一个非常奇怪的行为,我把它总结成一个非常基本的测试: 我用。当我运行它时,在附加两个路径的行上得到一个std::bad_alloc异常。这是我看到的gdb 这带来了几个问题: 我的测试代码有什么问题 为什么GDB在调用堆栈中使用python显示任何内容 预料到问题,我的g是< code>gcc版本8 . 3 . 0(Ubuntu 8 . 3 . 0-6 Ubuntu 1 ~ 18 . 0

  • 当异常在构造函数中被抛出时,其中创建了多个对象,必须做些什么来清理内存。例如。 我的直觉是,将每个对new的调用放在一个单独的try-catch组中,并删除之前为其调用了,但这太冗长的所有对象(第一个try组不调用析构函数,第二个类调用第一个类的析构函数,第三个类调用前两个类的析构函数,以此类推)。我的问题是:最常见的处理方法是什么? 另外,假设类对象包含一个不是用new创建的对象(因为它在堆栈上

  • 如果内存不足,我必须抛出异常。我真的不是专家。用这个方法怎么做?

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

  • 容器是 Docker 又一核心概念。 简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。 本章将具体介绍如何来管理一个容器,包括创建、启动和停止等。