可能STL迭代器方法抛出异常

Rae*_*ald 18 c++ stl exception

析构函数可能不会抛出异常(因此在异常处理期间可以完成堆栈展开),并且必须释放分配给该对象的任何资源(因此不会泄漏资源).包含多个其他对象(或分配了多个资源)的对象的设计可能会在STL容器中记录指向它们的指针.因此析构函数将使用以下与迭代器相关的方法:

  • begin(),end()对于容器
  • operator++ 对于有效的迭代器
  • operator*或者operator->对于有效的迭代器

但是为了保证析构函数不会抛出异常并释放其资源,您需要依赖那些永远不会抛出异常的方法.

依赖那些从不抛出异常的方法是否安全?很难想象一个实际的实现会抛出异常,因为STL迭代器本质上是一个指针.但标准C++是否要求这些方法永远不会抛出异常?我没有在C++标准中找到明确的陈述.


编辑:有趣的情况是C++ 03,当你想拥有一个指向资源的容器.这样做有充分的理由; 例如,如果您有多态资源.正如BjörnPollex在他的回答中指出的那样,如果你使用一个资源容器(比如a std::list< Resource >)而不是一个指向资源的指针的容器,容器的析构函数将为你处理对象的破坏(释放)Resource.

mlo*_*kot 17

operator ++用于有效的迭代器

C++标准(我指的是N3290草案)并没有给迭代器的增量运算符提供非保证.

例如,std::istreambuf_iterator::operator++呼叫中的效果std::basic_streambuf::sbumpc.该sbumpc可致电uflow这反过来可能会抛出异常.

  • 然而,这是指定的行为,即要求`istreambuf_iterator::operator++` 具有这种效果。但重要的是,如果 `sbumpc` 没有抛出异常,操作员不应该抛出异常。这通常是正确的 - 定义范围(容器)上的迭代器不能在该范围内递增时随意抛出异常。否则,一个实现可以简单地_总是_抛出一个异常并且仍然​​满足规范的要求。 (2认同)

Let*_*_Be 6

没有复制构造函数或返回迭代器的赋值运算符会引发异常

这是来自C++ 03标准.我不认为标准比这更进一步.

顺便说一句.它的23.1.10