可能STL迭代器方法引发异常
May STL iterator methods throw an exception
析构函数可能不会抛出异常(因此堆栈展开可以在异常处理期间完成(,并且必须解除分配给对象的任何资源(因此不会发生资源泄漏(。包含几个其他对象(或分配了几个资源(的对象的设计可能会在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_ptr
或unique_ptr
,或者使用类似Boost.Pointer container的东西来实现。
根据http://www.tenouk.com/Module31.html这些操作(对于"*"answers"->",还取决于存储的类型(对于STL容器来说不是抛出操作。
- 处理多个异常集合的C++方法
- 引发异常的方法的命名约定 (C++)?
- 有没有更好的方法来处理异常? try-catch块真的很丑
- C++ 捕获异常后进行清理的标准方法是什么?
- 方法c++内部出现异常
- 有没有一种方法可以让OpenCLC++绑定为所有错误抛出异常
- 关于异常,覆盖标准异常方法
- 处理许多自定义异常的最佳方法是什么
- 抽象包装带有异常的 C 错误处理的最佳方法
- 提出异常并处理C 的某些异常类型的正确方法是什么?
- 在类中抛出异常的最佳方法是什么
- 构造函数中的异常:init() 方法、指针、大型 try/catch 或
- 引发异常后无法退出方法
- 如何在C++中显式调用异常抛出方法
- 推荐一种在未输入获取行分隔符时引发异常的方法?
- 无法捕获模板规范化方法引发的异常
- 创建自己的异常(2种方法)C
- C 向量异常处理:哪一种是抛出out_of_range()的更好方法以及原因
- 有没有一种方法可以判断程序正在抛出异常
- 异常处理+多态性,如果异常方法在同一类中不起作用,则不起作用