チェックを行う反復子
チェックを行う反復子は、コンテナーの境界が上書きされないようにします。
チェックを行う反復子はビルドを解放し、ビルドをデバッグに適用されます。反復子を使用する方法の詳細については、デバッグ モードでコンパイルする場合、デバッグの反復子のサポートを参照してください。
解説
チェックを行う反復子によって生成された警告を無効にする方法については、_SCL_SECURE_NO_WARNINGSを参照してください。
チェックを行う反復子の機能を持つ次のシンボルを使用できます。
_SECURE_SCL
重要 _SECURE_SCLを制御するために _ITERATOR_DEBUG_LEVEL を使用します。詳細については、「_ITERATOR_DEBUG_LEVEL」を参照してください。
_SECURE_SCL が 1 と定義されている場合、反復子の安全な使用により、ランタイム エラーを発生させ、プログラムは終了します。が定義されている場合 0 として、チェックを行う反復子は無効になります。既定では、_SECURE_SCL の値は、リリース ビルドの 0 とデバッグ ビルドでは 1 です。
_SECURE_SCL が 1 と定義にすると、後続の SCL のチェックが実行されます:
すべての標準反復子 (たとえば、) vector::iteratorチェックされます。
出力反復子がチェックを行う反復子である場合は、標準の関数呼び出しにチェックされます (たとえば、) の動作を std::copy。
出力反復子がある場合は、標準の関数への三つ反復子の呼び出しでコンパイラの警告が表示されます。
次の関数は、コンテナーの境界の外にあるアクセスできる場合は、ランタイム エラーを生成します:
_SECURE_SCL が 0 と定義されている場合:
すべての標準反復子はオフです (反復子は、コンテナーの境界を越えて実行できますが、未定義の動作を導入)。
出力反復子がチェックを行う反復子である場合は、標準の関数呼び出しにチェックされます (たとえば、) の動作を std::copy。
出力反復子がオフ反復子である場合は、標準の関数でを呼び出して取得します (たとえば、) の動作をオフ 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
};
このプログラムではエラーについての追加情報を持つアサーション エラー ダイアログ ボックスが示されます。