Überprüfte Iteratoren
Überprüfte Iteratoren sicherstellen, dass die Grenzen des Containers nicht überschrieben werden.
Überprüfte Iteratoren gelten für Releasebuilds und Debugbuilds zu.Weitere Informationen dazu, wie Iteratoren, wenn Sie im Debugmodus kompilieren, finden Sie unter Debug- Iteratorunterstützung verwendet.
Hinweise
Informationen darüber, wie Sie Warnungen, die durch überprüfte Iteratoren generiert werden, finden Sie unter _SCL_SECURE_NO_WARNINGS deaktiviert.
Sie können das folgende Symbol mit der überprüften Iteratorfunktion verwenden.
_SECURE_SCL
Wichtig Verwendung _ITERATOR_DEBUG_LEVEL, _SECURE_SCL zu steuern.Weitere Informationen finden Sie unter _ITERATOR_DEBUG_LEVEL.
Wenn _SECURE_SCL als 1 definiert ist, verursacht unsichere Verwendung von Iteratoren einen Laufzeitfehler und das Programm wird beendet.Wenn sie als 0 definiert sind, werden überprüfte Iteratoren deaktiviert.Standardmäßig ist der Wert für _SECURE_SCL 0 für Releasebuilds und 1 für Debugbuilds.
Wenn _SECURE_SCL als 1 definiert ist, werden folgenden SCL-Überprüfungen ausgeführt:
Alle Standarditeratoren (beispielsweise, vector::iterator) werden überprüft.
Wenn ein Ausgabeiterator ein überprüfter Iterator ist, werden Sie Verhalten bei Aufrufen der Standardfunktion überprüft (beispielsweise, std::copy).
Wenn der Ausgabeiterator ist, Aufrufe eines verursachen deaktivierte Iterators zur Standardfunktion Compilerwarnungen.
Die folgenden Funktionen generieren einen Laufzeitfehler, wenn ein Zugriff gibt, der außerhalb der Grenzen des Containers ist:
Wenn _SECURE_SCL als 0 definiert wird:
Alle Standarditeratoren werden deaktiviert (Iteratoren können über den Containergrenzen hinaus bewegt, das undefiniertes Verhalten führt).
Wenn ein Ausgabeiterator ein überprüfter Iterator ist, werden Sie Verhalten bei Aufrufen der Standardfunktion überprüft (beispielsweise, std::copy).
Wenn ein Ausgabeiterator ein deaktivierter Iterator ist, erhalten Sie deaktiviertes Verhalten auf Aufrufe an die Standardfunktion (beispielsweise, std::copy).
Ein überprüfter Iterator ist ein Iterator an, der invalid_parameter_handler aufruft, wenn Sie versuchen, über die Grenzen des Containers zu wechseln.Weitere Informationen zu invalid_parameter_handler finden Sie unter Parametervalidierung.
checked_array_iterator Class und unchecked_array_iterator Class sind die Iteratoradapter, die überprüfte Iteratoren unterstützen.
Beispiel
Wenn Sie kompilieren, indem Sie _SECURE_SCL 1 verwenden, tritt ein Laufzeitfehler auf, wenn Sie versuchen, auf ein Element zuzugreifen, die außerhalb der Grenzen des Containers ist, indem Sie den Indizierungsoperator bestimmter Klassen verwendet.
// 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
};
Dieses Programm gibt "67 " bringen dann ein Assertionsfehlerdialogfeld mit zusätzlichen Informationen über den Fehler aus.
Auch wenn Sie kompilieren, indem Sie _SECURE_SCL 1 verwenden, tritt ein Laufzeitfehler auf, wenn Sie versuchen, auf ein Element zuzugreifen, indem Sie Vordergrund- oder Rückseite eines bestimmten Klassen verwenden, wenn der Container leer ist.
// 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
};
Dieses Programm wird nach einem Assertionsfehlerdialogfeld mit zusätzlichen Informationen zum Fehler.