可能STL迭代器方法引发异常

May STL iterator methods throw an exception

本文关键字:异常 方法 STL 迭代器 可能      更新时间:2023-10-16

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

  • 容器的begin()end()
  • 有效迭代器的operator++
  • 有效迭代器的operator*operator->

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

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


编辑:有趣的情况是C++03,当您想要有一个指向资源的指针的容器时。这样做有充分的理由;例如,如果您有多态资源。正如Björn Pollex在回答中指出的那样,如果您使用资源容器(如std::list< Resource >(而不是指向资源的指针容器,则容器的析构函数将为您处理Resource对象的销毁(释放(。

有效迭代器的运算符++

C++标准(我参考N3290草案(没有为迭代器的增量运算符提供任何保证。

例如,std::istreambuf_iterator::operator++在对std::basic_streambuf::sbumpc的调用中起作用。CCD_ 10可以调用CCD_。

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

这来自C++03标准。我不认为这个标准会更进一步。

Btw。它是23.1.10

因此,析构函数将使用以下与迭代器相关的方法

不,不会的。该对象的析构函数只会调用容器的析构因子,从而保证容器不会引发异常。

如果正确使用RAII,您几乎永远不会遇到必须显式释放资源的情况。这可以通过容器存储shared_ptrunique_ptr,或者使用类似Boost.Pointer container的东西来实现。

根据http://www.tenouk.com/Module31.html这些操作(对于"*"answers"->",还取决于存储的类型(对于STL容器来说不是抛出操作。