返回首页

简介
受检迭代子的东西我已经知道了一段时间,但从来没有真正困扰使用或更好地了解,直到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}

回答

评论会员:richy_b 时间:2011/12/14
嗨,这似乎现在_SECURE_SCL定义默认打开新版本的VS2010的STL实现。

请参阅这篇文章:
VS2010的:
{A3}

VS2008的:
{A4}
评论会员:肖恩Poulson 时间:2011/12/14
我是希望看到工作检查的迭代器的例子。

---
肖恩Poulson
spoulson@explodingcoder.com
评论会员:维迪奇Trifunovic 时间:2011/12/14
肖恩Poulson写道:我希望能看到工作检查的迭代器的例子。

你好,肖恩。

你的意思是检查经营者的实施例子吗?正如我在文章中提到,你可以找到这样一个样本实现Stroustrup的书。这篇文章是关于使用受检迭代子,不执行。

感谢您的评论。


编程博客
UTF8 - CPP
评论会员:肖恩Poulson 时间:2011/12/14
...,直到2005年发布的Microsoft Visual C。它来检查的标准库版本,甚至在释放模式

我指的是你的检查,2005年在VC已有的迭代器参考。我希望能看到这个特殊的实现,例如...或STLport中的,或...





---
肖恩Poulson
spoulson@explodingcoder.com
评论会员:joxhy 时间:2011/12/14
我有Vista Ultimate和我不知道Aero效果是什么。我没有禁用任何功能,但我的机器是不是线机的顶部。您的应用程序出现,要工作,直到我尝试查看thumbanils所以我可以巫婆。这是应用程序失败时。我喜欢你做了什么。我一直想这个功能(因为它已经在Linux几年),我很失望,Vista中没有提供的。

保持良好的工作