Destructors may not throw exceptions (这样stack unwinding可以在异常处理期间完成),并且必须释放分配给对象的任何资源(这样就不会有资源泄漏)。包含多个其他对象(或分配了多个资源)的对象的设计可能会在STL容器中记录指向这些对象的指针。因此,析构函数将使用以下与迭代器相关的方法:
有效迭代器的
begin()
,containeroperator++
的iteratoroperator*
end()
或有效迭代器的operator->
但是,为了保证析构函数不抛出异常并释放其资源,您需要依赖那些从不抛出异常的方法。
依赖那些从不抛出异常的方法安全吗?很难想象一个实际的实现会抛出异常,因为在幕后,STL迭代器本质上是一个指针。但是标准的C++ 是否要求这些方法从不抛出异常的呢?我还没有在C++标准中找到一个明确的声明。
编辑:有趣的案例是C++ 03,当你想要拥有a container of to resources的时候。这样做有很好的理由;例如,如果您有多态资源。正如Björn Pollex在他的回答中指出的那样,如果您使用资源容器(如std::list< Resource >
)而不是指向资源的指针容器,容器的析构函数将为您处理Resource
对象的销毁(释放)。
发布于 2011-10-26 21:08:25
有效迭代器的
operator++
C++标准(我指的是N3290草案)没有为迭代器的增量运算符提供无抛保证。
例如,调用std::basic_streambuf::sbumpc
时的std::istreambuf_iterator::operator++
效果。sbumpc
可能会调用uflow
,而后者又可能抛出异常。
发布于 2011-10-26 20:25:34
返回迭代器的无复制构造函数或赋值运算符引发异常
这来自于C++03标准。我不认为这个标准会比这更进一步。
顺便说一句。我是23.1.10
发布于 2011-10-26 20:22:32
因此,
析构函数将使用以下与迭代器相关的方法
不,它不会。该对象的析构函数只会调用容器的析构函数,而容器的析构函数又会被保证不会抛出异常。
如果正确使用RAII,您几乎不会遇到必须显式释放资源的情况。这可以通过让容器存储shared_ptr
或unique_ptr
,或者使用Boost.Pointer Container之类的东西来实现。
https://stackoverflow.com/questions/7902452
复制相似问题