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

标签 c++ exception stl

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

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

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

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


编辑:有趣的情况是 C++ 03,当你想要 a container of pointers to resources .这样做有充分的理由;例如,如果您有多态资源。如Björn Pollex在他的回答中指出,如果您使用资源容器(例如 std::list< Resource > )而不是指向资源的指针容器,则容器的析构函数将负责 Resource 的销毁(释放)给你的对象。

最佳答案

operator++ for a valid iterator

C++ 标准(我引用 N3290 草案)不保证迭代器的增量运算符。

例如,std::istreambuf_iterator::operator++ 会影响对 std::basic_streambuf::sbumpc 的调用。 sbumpc 可能会调用 uflow 进而可能引发异常。

关于c++ - 可能 STL 迭代器方法抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7902452/

相关文章:

c++ - 如何在 C 函数中使用 std::vector

c++ - 将初始值设定项列表与返回引用的用户定义转换运算符一起使用时复制返回值

c# - C# 中 System.Net 的 Webclient 无法连接到服务器

c++ - 在 DDD 中显示 STL 类

c++ - 指针 : Does it move the whole address range? 上的 For 循环

c# - 如何在异常中显示对象列表?

python - 在 Django 中抛出自定义异常时异常值字段为空

c++ - 按值将initializer_list 作为列表传递是否很昂贵?

c++ - 仅通过迭代器删除 STL 容器元素

c++ - 代码块中的歧义编译