经过检查的迭代器
经过检查的迭代器确保您的容器区域不会复盖。
经过检查的迭代器应用于发布版本和调试版本。 有关如何使用迭代器的更多信息,在编译时调试模式,请参见 调试迭代器支持。
备注
有关如何禁用由经过检查的迭代器生成的警告的信息,请参见 _SCL_SECURE_NO_WARNINGS。
可以使用经过检查的迭代器函数的以下符号。
_SECURE_SCL
重要
使用 _ITERATOR_DEBUG_LEVEL 控件 _SECURE_SCL。有关更多信息,请参见_ITERATOR_DEBUG_LEVEL。
如果 _SECURE_SCL 定义为 1 中,对迭代器的不安全使用导致运行时错误,程序终止。 如果定义为 0,经过检查的迭代器被禁用。 默认情况下,_SECURE_SCL 的值为 0 版本编译的,而 1 为调试版本。
当 _SECURE_SCL 定义为 1 时,下面的 SCL 检查操作:
所有标准迭代器 (例如,vector::iterator) 进行检查。
如果输出迭代器是经过检查的迭代器将受到检查行为对标准函数 (例如,std::copy)。
如果输出迭代器是一个未经检查的迭代器调用标准函数将导致编译器警告。
以下函数将生成一个运行时错误,如果有是在容器的边界之外的访问:
当 _SECURE_SCL 定义为 0:
所有标准迭代器是未经检查的迭代器 (可能在容器边界之外移动,导致未定义的行为)。
如果输出迭代器是经过检查的迭代器将受到检查行为对标准函数 (例如,std::copy)。
如果输出迭代器是一个未经检查的迭代器将例如未经检查的行为对标准函数的 GET (,std::copy)。
经过检查的迭代器是指将调用 invalid_parameter_handler 的一个迭代,如果您尝试将通过容器的边界。 有关invalid_parameter_handler的更多信息,请参见参数验证。
checked_array_iterator Class 和 unchecked_array_iterator Class 是支持经过检查的迭代器的迭代器适配器。
示例
使用 _SECURE_SCL 1,在生成过程中,一个运行时将发生错误,如果尝试访问使用某些选件类的索引运算符,是在容器的边界之外的元素。
// checked_iterators_1.cpp
// cl.exe /Zi /MDd /EHsc /W4
#define _ITERATOR_DEBUG_LEVEL 1
// implies #define _SECURE_SCL 1
#include <vector>
#include <iostream>
using namespace std;
int main()
{
vector<int> v;
v.push_back(67);
int i = v[0];
cout << i << endl;
i = v[1]; // triggers invalid parameter handler
};
此过程将输出“67 "然后弹出将附加信息的断言失败"对话框中有关该失败。
同样,那么,当使用 _SECURE_SCL 1,则生成,则会发生运行时错误将生成借助某些选件类,前者或返回,如果尝试访问一个元素,那么,当容器为空。
// checked_iterators_2.cpp
// cl.exe /Zi /MDd /EHsc /W4
#define _ITERATOR_DEBUG_LEVEL 1
// implies #define _SECURE_SCL 1
#include <vector>
#include <iostream>
using namespace std;
int main()
{
vector<int> v;
int& i = v.front(); // triggers invalid parameter handler
};
此过程将弹出将附加信息的断言失败"对话框中有关该失败。