简介
受检迭代子的东西我已经知道了一段时间,但从来没有真正困扰使用或更好地了解,直到2005年发布的Microsoft Visual C的。它来检查,甚至在释放模式与标准库版本,并从其他编译器的代码移植时,我在实践中既好和坏的方面使用受检迭代看到。受检迭代工作了一年的话题做一些研究之后,我觉得这是一个好时机,分享我的知识与代码项目和社区聚集。本文的结构在一系列尝试短的问题和答案,容易阅读。问题和答案受检迭代子是什么?
受检迭代子容器和其他范围提供检查访问。他们通常拥有的容器,并能够捕捉一些运行时的错误,往往会导致未定义的行为,然后抛出一个异常或终止应用程序不喜欢的东西,是定义良好的,。这是避免安全有关的问题,如堆和栈溢出,特别是在有用的。什么样的错误受检迭代检测?
这实际上取决于其实施。一些常见的错误,他们可以赶上是:
未初始化的迭代器:vector<int>::iterator it;
it++;
输出的范围内访问:{C}
比较从不同范围或容器的迭代器:
迭代器可以检查发现其他类型的错误,如在容器内/范围的无效数据?for (it = vec1.begin(); it != vec2.end(); ++it)
是。例如,库2.0或更高版本检查,能够检测到无效的UTF - 8序列的迭代器适配器:utf8::iterator<std::string::iterator> it(u8string.begin(),
u8string.begin(), u8string.end());
it++; // throws an exception in case of an invalid utf-8 sequence
注意,我们通过迭代器适配器的构造函数的参数的有效范围边界。是否有检查,以及容器,如果是有什么好的?
正如检查迭代器保持跟踪它们的容器,容器可以保持跟踪的迭代器。这使捕获的失效或"悬空"的迭代器的使用,如错误:有一个简单的方法变成一个选中一个未经检查的迭代器吗?
。 Dinkumware和STLport中,有些STL实现提供checked和unchecked版本,并在它们之间切换特定的宏设置所需的值是一个简单的事情。这是特别方便,如果你想使用在调试模式下,在释放模式,这是一个很常见的场景未经检查的受检迭代子。
除此之外,你可以写一个检查迭代器适配器,会变成一个选中一个未经检查的迭代器。 Bjarne的Stroustrup的C编程语言在他的经典书,给出了这样一个迭代器适配器的例子。在一般情况下,它可以宣布类似:template <typename base_iterator, typename container_type>
class checked_iterator;
使用像:checked_iterator<myvectype::iterator, myvectype> it (vecit, vec);
it++; // checked
当然,这种适配器是一个全面的检查STL实现穷人的更换,但仍有可能是非常有益的。使用受检迭代子是否有缺点?
是 - 性能。受检迭代子肥和慢比其取消选中,和速度上的差异(很少在内存占用)可以显著。有时只使用在开发过程中,第一轮测试检查的迭代器,船舶未经检查的迭代器软件,它是一个好主意,但真正的具体情况而定。微软的Visual C是否与受检迭代子来?
是。在版本8.0(VC 2005年)的迭代器和容器检查默认情况下,即使在发布版本。要打开检查的迭代器关闭,_SECURE_SCL宏必须设置为0。默认情况下,在检测到一个错误的情况下,该方案得到终止调用invalid_parameter。设置的_SECURE_SCL_THROWS 1,检查的迭代器在这种情况下抛出标准异常错误的情况下,这种行为可能会改变。结论
选中的迭代器是一个工具,你应该了解和使用适当的,至少在发展。参考文献Bjarne的Stroustrup的C编程语言。
香草萨特,安德烈Alexandrescu:{A}。MSDN库:{A2}