首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >可能的STL迭代器方法抛出异常

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

Stack Overflow用户
提问于 2011-10-26 20:18:08
回答 4查看 5.9K关注 0票数 19

Destructors may not throw exceptions (这样stack unwinding可以在异常处理期间完成),并且必须释放分配给对象的任何资源(这样就不会有资源泄漏)。包含多个其他对象(或分配了多个资源)的对象的设计可能会在STL容器中记录指向这些对象的指针。因此,析构函数将使用以下与迭代器相关的方法:

有效迭代器的

  • begin(),container
  • operator++的iterator
  • operator* end()或有效迭代器的operator->

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

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

编辑:有趣的案例是C++ 03,当你想要拥有a container of to resources的时候。这样做有很好的理由;例如,如果您有多态资源。正如Björn Pollex在他的回答中指出的那样,如果您使用资源容器(如std::list< Resource >)而不是指向资源的指针容器,容器的析构函数将为您处理Resource对象的销毁(释放)。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-10-26 21:08:25

有效迭代器的

operator++

C++标准(我指的是N3290草案)没有为迭代器的增量运算符提供无抛保证。

例如,调用std::basic_streambuf::sbumpc时的std::istreambuf_iterator::operator++效果。sbumpc可能会调用uflow,而后者又可能抛出异常。

票数 18
EN

Stack Overflow用户

发布于 2011-10-26 20:25:34

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

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

顺便说一句。我是23.1.10

票数 6
EN

Stack Overflow用户

发布于 2011-10-26 20:22:32

因此,

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

不,它不会。该对象的析构函数只会调用容器的析构函数,而容器的析构函数又会被保证不会抛出异常。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7902452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档