C++ 任何C++;98标准容器操作抛出std::错误?

C++ 任何C++;98标准容器操作抛出std::错误?,c++,stl,C++,Stl,我试图确定以下代码中是否需要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) { ++(*ite

我试图确定以下代码中是否需要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?
}
std::向量值;
//忽略这会抛出std::bad\u alloc
值。推回(1);
试一试{
for(std::vector::iterator iter=values.begin();
iter!=values.end();++iter){
++(*国际热核实验堆);
}
}捕获(const std::bad_alloc&){
//需要这个吗?
}
<> P>通过C++ 1998标准,我唯一能找到的提示是23.1节“容器需求”弹着点8,其中包含了一个句子:

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


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

理论上是的,任何标准库容器成员函数都可能抛出
错误的alloc

除了(
std::vector::at()
)之外,大多数标准容器本身不会引发任何异常,但它们可以为内存分配失败或用户定义操作的异常引发异常


我想你的恐惧是你的例子中出现了
push_back()
,如果不是,那么你是偏执狂。尽管如此,实际上这是一个实现细节,如果您只是获取迭代器(
begin()
end()
),几乎没有一个实现会尝试分配,因此,在缺乏证据的情况下,我们将不得不得出结论,从技术上讲,任何容器方法都可以抛出
bad\u alloc


就容器本身而言,我不会担心
begin
end
抛出,但还有另一个麻烦点:迭代器实现。如果迭代器是类类型的,那么理论上这种实例的构造(或赋值)很可能会抛出。因此,虽然我不认为随机选择的标准库实现会抛出异常,但您不能真正排除这种可能性。

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

  • erase()
    pop_-back()
    pop_-front()
    函数引发异常
  • 返回的迭代器的复制构造函数或赋值运算符都不会引发异常

如果你真的偏执,那么你应该考虑代码< >开始()/代码>和<代码>结束()/<代码>,甚至迭代器增量,投掷;但是他们不需要在标准容器的任何合理实现中执行任何复杂的操作。

您是否因为编译器的限制而查看98标准?因为现在有03和11。@GManNickG-是的,这是由于我所针对的平台支持的编译器的限制。我很高兴“push_back()”可以抛出,我希望对于任何正常的容器实现都可以抛出。我想知道还有什么其他容器方法调用可以抛出,而且似乎大多数容器方法调用,包括访问条目,都可以抛出。@FreeWildebeest:从技术上讲,是的。实际上没有。我做过一次
container.resize(var1*var2)
,其中
var2
未初始化(而且很大)。结果很糟糕_alloc@Michael:
var2
由于未初始化,您的程序在技术上已经有了UB,任何事情都有可能发生。@Als-但我如何确保我使用的封闭源代码实现不会从其中一个方法中抛出错误的alloc?